티스토리 뷰
weevely 는 php를 이용해 웹 쉘, 백도어를 만드는 패키지이다.
php 파일을 이용해 타겟을 조종하거나, 세션 복구 등을 진행시킨다.
실습용으로 metasploitable의 dvwa에 이를 적용해보자.
먼저 웹 쉘을 하나 만든다.
weevely generate <password> <file path>
위와 같이 php 파일이 하나 만들어진다.
이제 해당 파일을 dvwa에 업로드하자.
id : admin
pw : password
실습을 위해 security를 low로 설정한다.
이제 upload에 들어가 방금 생성한 shell.php를 업로드한다.
../../hackable/uploads/shell.php 가 정상적으로 업로드 되었다.
현재 url이 http://192.168.184.130/dvwa/vulnerabilities/upload/# 이므로 shell.php 파일은 dvwa/hackable/uploads/ 에 존재한다.
따라서 kali 터미널에서 http://192.168.184.130/dvwa/hackable/uploads/shell.php 를 실행시킨다.
weevely <url> <password>
웹 쉘이 성공적으로 실행이 된다.
현재 dvwa의 security가 low이므로 medium으로 변경하고 burp를 이용해 웹 쉘을 저장시켜보자.
shell2.php를 위와 동일하게 만들고 업로드를 해보면 다음과 같다.
이미지가 업로드 되지 않았다는 문구가 발생한다.
medium 일 때는 소스코드를 확인해보면 jpeg 일 때만 업로드를 허용하고 있다. (따라서 png도 업로드 안 됨)
이제 burp를 이용해 이를 뚫어보자.
burp는 kali에서 사용 가능한 프록시 도구이다. 프록시를 하나 만들어 응답을 보낼 서버에 어떤 식으로 값이 들어가는 지 확인할 수 있으며, 그 값을 변경하여 응답을 보낼 수도 있다.
처음 틀면 위와 같은 모습을 하고 있다. burp에서 브라우저를 열고 다시 위 사이트로 접속하자.
접속 후 다시 security를 medium으로 변경하였으며, shell2.php를 업로드 하기 전 프록시를 켠다.
shell2.php를 업로드하면 burp에서 forward를 눌러주기 전까지 해당 응답이 dvwa 서버로 전달되지 않는다.
현재 burp에 잡힌 패킷은 다음과 같다.
현재 업로드하고자 하는 파일이름이 shell2.php이고 파일 타입이 php임을 알고 있다.
따라서 파일 이름을 shell2.php.jpg로 변경을 하고 forward를 진행하자.
즉, 서버가 타입 확인만 하고, 진짜 그림인지 아닌지 검사를 하지 않을 것이라 생각하고 확장자만 변경하여 업로드를 진행한다.
성공적으로 업로드가 되었다.
따라서 다시 kali 터미널에서 shell2.php.jpg 를 실행시키자.
성공적으로 웹 쉘을 실행시킬 수 있다.
실제로 medium 일 때 upload 부분의 소스코드 확인 시 jpeg 타입인지 확인하는 것을 알 수 있다.
마지막으로 security level 이 high 일 때도 동일하게 해보면 다음과 같다.
(shell3.php.jpg 로 이름 변경)
위와 같이 shell3.php.jpg 로 업로드가 가능하고, 웹 쉘 실행이 가능하다.
왜냐하면 high 일 때도 마찬가지로 확장자를 좀 더 디테일하게 체크할 뿐, 실제 이미지인지 아닌지는 검사하지 않는다.
그렇다면 이러한 문제를 해결하기 위해서는 어떻게 해야 할 것인가.
dvwa github에는 impossible 버전이 존재한다.
https://github.com/digininja/DVWA/blob/master/vulnerabilities/upload/source/impossible.php
해당 소스코드를 살펴보면 실제 그림인지 아닌지를 판단하는 부분이 존재한다.
업로드된 바이너리에 대해 인코딩을 다시 한 후 실제 메타데이터를 뽑아내어 해당 파일이 진짜 이미지인지 아닌지를 판단하게 된다.
따라서 웹 서버 구성 시 웹 쉘, 백도어 등을 막기 위해서는 위와 같은 보안 장치가 필수적이다.
(대부분 웹 프레임워크는 저런 것을 기본으로 설정해놓았겠지만, 오래된 사이트 등에서는 여전히 취약할 수 있다.)