본문 바로가기
Hacking/Hacking Beginner Class (normaltic)

[해킹 비기너 클래스] 4주차 Practice

by st-og 2023. 8. 11.

Q. DB의 segfault 계정 비밀번호를 알아내보자! 

 

먼저 tryhackme에서 제공한 vm머신이 어떤 서비스를 하는지 알기 위해 nmap을 통해 열려있는 포트를 확인했다.

nmap 결과 80번 포트가 열려 있는 것을 확인할 수 있고

웹사이트가 열려있음을 확인했기에 해당 사이트에 접속을 해보았다.

 

처음 웹사이트에 접속을 하면 이러한 인덱스 페이지를 볼 수 있다.

 

 

회원가입과 로그인을 끝내면 해당 페이지를 볼 수 있는데

 

 

게시판에 들어가 보면

 

 

글쓰기가 가능한 게시판이 보인다.

글쓰기 버튼을 눌러보면

 

 

제목과 내용 그리고 파일을 업로드할 수 있는 칸이 보인다.

우리는 Reverse Shell이 가능한 악성코드가 첨부된 파일을 올려 해킹을 해보려 한다.

 

먼저 Reverse Shell 악성코드가 필요한데 구글에 해당 서버언어의 Reverse Shell을 검색하면 바로 찾을 수 있다.

이 서버는 php로 작성되어 있는 것을 URL을 통해 확인할 수 있으니 php reverse shell을 검색하면 되는 것이다.

 

 

그럼 누군가 만들어둔 악성코드를 찾을 수 있고 해당 파일을 다운로드 후 약간의 수정 후 올리기만 하면 된다.

wget 명령어를 사용해 다운로드를 하면 쉽게 할 수 있다.

wget [경로] -O [저장할 이름]

 

이름은 webshell.php로 저장했다.

 

저장한 webshell.php를 수정하기 위해 vi 에디터로 열어주면

 

 

이러한 많은 코드들이 보이는데 우리가 찾아서 수정해줘야 하는 곳은 리스닝 ip와 포트번호이다.

 

 

ip와 port를 내 ip와 임의의 포트번호로 바꿔주면 된다.

포트번호는 웹사이트이기에 443으로 지정해 줬다.

 


 

수정이 된 파일을 첨부하여 글을 올려보자

 

 

create 버튼을 누르면 글이 성공적으로 올라간 것을 확인할 수 있다.

 

하지만 글을 올리기만 해서는 reverse shell이 작동되지 않는다 

우리 글의 파일이 어느 디렉터리에 위치해 있는지 확인한 후 실행을 해줘야 reverse shell이 작동이 될 것이다

 

먼저 나의 글에 들어가 보자

 

 

들어가 보면 Download 버튼이 보이는데 해당 버튼을 오른쪽 클릭 후 경로를 복사하면 

파일의 경로를 확인할 수 있다.

 

http://10.10.231.213/files/user1/webshell.php

 

해당 파일 경로를 URL 주소창에 입력해 주면 Shell이 성공적으로 연결된다.

 

 


Tip. 쉘이 성공적으로 연결이 된다면 먼저 쉘을 좀 더 보기 편하게 만들어 주는 게 좋다.

python3 -c "import pty;pty.spawn('/bin/bash')"

이제 쉘을 획득했으니 처음 목표인 DB의 비밀번호를 알아내야 한다.

대부분의 웹서버는 웹과 DB를 연결하는 과정을 한다.

우리는 DB를 연결하는 코드를 찾으면 비밀번호를 함께 알 수 있을 것이다.

 

먼저 그럼 리눅스에서 웹에 대한 정보를 저장하는 /var/www/html 경로에 가보자

 

상당히 많은 php 파일들을 볼 수 있는데 모든 파일들을 열어보며 DB와 연동하는 코드를 찾기에는 어려움이 많을 것이다.

이때 방법은 2가지 정도인 것 같다.

 

1. DB가 사용될법한 페이지의 코드를 열어보기

2. grep 명령어를 통해 segfault가 들어간 모든 명령줄 확인하기

 

1번 방법

사용자의 ID와 PW를 사용하거나 조회해야 하는 경우는 언제 생길까?

아마 로그인이나 회원가입할 때 자주 사용이 될 것이다.

그럼 우리는 위의 추측에 의해 login.php나 signup.php를 먼저 확인해 보면 된다.

 

login.php

 

signup.php

 

두 php 파일 모두 mysqli_connect() 함수를 사용하는 것을 확인할 수 있는데

해당 함수는 php파일에서 mysql 데이터베이스로 연결을 하기 위해 사용되는 함수이다들어가는 매개변수의 값은 

mysqli_connect(호스트, 사용자명, 비밀번호, 데이터베이스명);

으로 지정되어 있다.

 

그러므로 우리는 

$conn = mysqli_connect('localhost', 'segfault', 'youGotThis?', 'segFault_sqli');

해당 한 줄을 보고 segfault 계정의 비밀번호가 youGotThis? 인 것을 알 수 있다.

 

 

2번 방법

grep을 사용하기 위해선 패턴과 경로설정이 중요한데 

패턴은 segfault로 정하였고 경로는 /var/www/html 디렉터리 안에 있는 모든 파일들로 정하였다.

 

grep -r segfault /var/www/html 2>/dev/null

*부가 설명

더보기

-r 옵션은 디렉터리 안에 있는 파일들까지 확인하기 위해 사용했다
2> /dev/null : 오류 문구들은 출력을 하지 않기 위해 사용했다

 

해당 명령어를 입력하게 되면

 

 

많은 명령줄들을 확인할 수 있다.

하지만 모든 명령어들이 다 mysqli_connect 함수를 사용하는 문장들이기에

위와 동일한 방법으로 비밀번호를 알아낼 수 있다.