Reverse Shell
WinAPI
Giới thiệu về Sockets
Socket là một trong những kỹ thuật cơ bản nhất trong truyền thông trên mạng máy tính
Socket là một phương thức thực hiện truyền thông giữa các tiến trình được BSD đề xuất.
BSD: Berkeley Software Distribution
Socket được sử dụng để một tiến trình “nói chuyện” với một tiến trình khác.
Nhiều ứng dụng thông dụng hiện nay sử dụng kỹ thuật socket như: trình duyệt web, email client, …
Socket API
Giao diện lập trình socket trên Windows, winsock, là một đặc tả của nhiều hãng phần mềm nhằm chuẩn hóa cách thức sử dụng TCP/IP trên Windows. Socket API dựa trên nền Berkeley socket.
Trong BSD Unix, socket là một phần trong kernel của hệ điều hành. Nó cung cấp các dịch vụ IPC cục bộ hoặc giữa các tiến trình trên mạng
IPC: InterProcess Communication
Trong MS-DOS, Windows, MacOS và OS/2, sockets được cung cấp dưới dạng các thư viện lập trình.
Các loại socket
Stream socket: TCP socket
Datagram socket: UDP socket
Raw socket: IP socket
TCP: Transmission Control Protocol
UDP: User Datagram Protocol
IP: Internet Protocol
TCP/IP
TCP/IP là một bộ giao thức, được xây dựng dựa trên kỹ thuật “phi kết nối”. Dữ liệu được truyền theo từng dãy các gói tin đơn lẻ.
TCP được sử dụng cho các dịch vụ với khả năng truyền dữ liệu lớn và một kết nối liên tục.
UDP thường được sử dụng cho các thao tác tìm kiếm nhanh hay các truy vấn đơn lẻ
Thông thường, các ứng dụng TCP/IP sử dụng 4 lớp:
Một giao thức ứng dụng, chẳng hạn như email, ftp hay www
Một giao thức cung cấp các dịch vụ cần thiết cho các ứng dụng, chẳng hạn như TCP/UDP
IP cung cấp dịch vụ cơ bản chuyển giao các gói tin đến đúng địa chỉ đích
Các giao thức cần thiết để quản lý phương tiện truyền dẫn vật lý, chẳng hạn như Ethernet hay một đường nối điểm – điểm
So sánh TCP/IP và OSI
TCP
Hướng kết nối
Giao thức hướng kết nối:
Các giao thức dựa trên phiên làm việc hay sự chuyển giao các gói tin có thứ tự
Cung cấp dịch vụ kết nối hai chiều tin cậy dựa trên một phiên làm việc
Các gói tin được đánh số thứ tự duy nhất
Từng gói tin chuyển giao được xác nhận truyền/nhận thành công
Các gói tin nhận trùng lắp được phát hiện và loại bỏ
Các giao thức hướng kết nối hoạt động theo ba giai đoạn
Thiết lập kết nối: hai tiến trình truyền/nhận thiết lập kết nối và thống nhất các tham số định nghĩa kết nối
Truyền nhận dữ liệu: hai tiến trình truyền nhận dữ liệu dựa trên kết nối đã được thiết lập
Giải phóng kết nối: kết nối giữa hai tiến trình được giải phóng
Đảm bảo độ tin cậy trong quá trình truyền dữ liệu
Phân đoạn dữ liệu truyền thành các gói tin đơn lẻ
Dữ liệu truyền được đánh số thứ tự
Cung cấp cơ chế phản hồi sau khi nhận được dữ liệu
Sử dụng cơ chế phát hiện lỗi checksums
TCP Client
Xác định địa chỉ IP và cổng dịch vụ ở server
Tạo một socket với cổng dịch vụ cục bộ bất kỳ do TCP chỉ định
Kết nối socket đến server
Gửi yêu cầu và nhận thông tin phản hồi từ server
Đóng kết nối
TCP Server
Tạo một socket và gán cho socket một địa chỉ cố định (IP và port) để cung cấp dịch vụ
Đặt socket ở chế độ passive
Chấp nhận yêu cầu thiết lập kết nối từ client và nhận socket mới từ hệ thống
Thực hiện quá trình lặp nhận yêu cầu và gửi thông tin phản hồi
Khi client kết thúc, đóng kết nối và trở về trạng thái chờ chấp nhận yêu cầu thiết lập kết nối từ các client
UDP
Phi kết nối
Giao thức phi kết nối:
Đơn giản, nhưng không tin cậy. Không cung cấp cơ chế điều khiển đường truyền dựa trên việc đánh số thứ tự dữ liệu truyền hoặc cơ chế xác nhận
Cung cấp tính năng broadcast thông tin
Dữ liệu được truyền/nhận theo từng gói tin đơn lẻ: datagram hay packet.
Một datagram là một thông điệp độc lập được gửi qua mạng -- không được đảm bảo đến đích, thời điểm đến đích và nội dung thông điệp
Thích hợp cho các ứng dụng broadcast
Được sử dụng trong các môi trường không xác định được host nhận dữ liệu
Khả năng truyền thông điệp nhanh -- sử dụng trong các ứng dụng không quan tâm đến việc dữ liệu được truyền đến đích đúng và đủ
Không phân đoạn dữ liệu truyền
Không cung cấp cơ chế tập hợp dữ liệu nhận cũng như đồng bộ quá trình truyền nhận dữ liệu
Nếu có lỗi xảy ra, ứng dụng bắt buộc phải thực hiện truyền lại dữ liệu
Không có cơ chế phản hồi sau khi nhận dữ liệu
UDP Client
Xác định địa chỉ IP và cổng dịch vụ ở server
Tạo một socket với cổng dịch vụ cục bộ bất kỳ do UDP chỉ định
Chỉ định server cần giao tiếp
Gửi yêu cầu và nhận thông tin phản hồi từ server
Đóng socket
UDP Server
Tạo một socket và gán cho socket một địa chỉ cố định (IP và port) để cung cấp dịch vụ
Thực hiện quá trình lặp nhận yêu cầu và gửi thông tin phản hồi
Các ví dụ về TCP / UDP
Sockets
Khi được tạo ra, một socket không có những thông tin chỉ định cách thức hoạt động
Bộ giao thức TCP/IP sẽ định nghĩa một điểm kết nối trên socket, gồm có một địa chỉ IP và một số hiệu cổng dịch vụ
Địa chỉ socket
Địa chỉ của một socket trên mạng TCP/IP gồm có hai phần:
Địa chỉ IP: một số nguyên 32 bits xác định duy nhất một card mạng trên máy tính (host)
Cổng dịch vụ: một số nguyên 16 bits xác định điểm kết nối với một ứng dụng trên một host. Các ứng dụng thương mại hay các dịch vụ thông dụng sử dụng các cổng dịch vụ chuẩn đã được đăng ký.
Passive/Active Socket
Passive socket được sử dụng ở chương trình server để chờ nhận các kết nối đến từ client
Active socket được sử dụng ở chương trình client để thiết lập kết nối đến chương trình server
Lập trình Winsock
Thư viện
winsock2.h
Kiểu dữ liệu
WSADATA
SOCKADDR_IN
LPSOCKADDR
Các giá trị hằng số
AF_INET
SOCK_STREAM / SOCK_DGRAM
INVALID_SOCKET
SOCKET_ERROR
Note:
WSAStartup: https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsastartup
MAKEWORD macro: https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms632663(v=vs.85)
socket: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket (không hoạt động)
-> WSASocket: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa
WSAGetLastError: https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsagetlasterror
SOCKADDR_IN: https://learn.microsoft.com/vi-vn/windows/win32/api/ws2def/ns-ws2def-sockaddr_in
inet_addr: https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-inet_addr (ko xài được)
-> inet_pton: https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_pton
htons: https://learn.microsoft.com/vi-vn/windows/win32/api/winsock/nf-winsock-htons
connect: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
CreateProcessW: https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw
STARTUPINFOW: https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfow
PROCESS_INFORMATION: https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-process_information
memset: https://cplusplus.com/reference/cstring/memset/
WaitForSingleObject: https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject
© 2024,Pham Quoc Trung. All rights reserved.
Last updated