[ 실습 목표 ]
Remotely, find out the user of the web service on the OS, as well as the machines hostname via RCE.
원격으로 RCE를 통해 OS의 웹 서비스 사용자 및 시스템 호스트 이름을 확인하는 것이 목표다.
여기서 RCE 가 무엇일까?
RCE(Remote Code Execution) 취약점 : 응용 프로그램이 적절한 입력의 유효성 검사 없이 쉘 명령을 실행할 때 발생하는 취약점.
[실습 화면]
- Low 와 마찬가지로 IP 를 입력하면 Ping 을 보내는 기능을 가지고 있는 폼이다.
- 일단 IP 주소를 한번 입력해보자!
- 정상적으로 동작하는 것을 확인할 수 있다.
- Low 레벨에서 사용했던 ;, &&, | 을 사용하여 명령어를 실행 시켜 보았다.
- 위와 같이 명령어를 입력했는데 아무 일도 일어나지 않았다. 한번 다양한 문자로 다시 시도해보았다.
- | 문자를 사용해보니 결과가 출력되었다.
- 공격이 통하는 문자를 입력하거나 기능이 출력될 때 로딩 시간이 좀 긴 듯 하다.
- && 문자는 먹히지 않았다. 그렇다면 | 문자를 사용하여 다른 명령어를 수행해보았다.
- 현재 경로를 파악해보았다.
- |cat etc/passwd 를 통해서 유저의 정보를 얻어냈다.
- hostname 명령어를 통해서 시스템 호스트 이름을 알아냈다.
- 이제 소스 코드를 분석해보자!
- 폼의 입력값을 POST 메소드로 서버에 전송하고 해당 아이피에게 폼에 입력한 동작을 요청을 하는 것인데 여기서 substitutions 에서 필터링을 거친다.
- | 명령어는 먹히는 이유가 여기서 발견된다.
- $target 변수의 명령어가 입력한 IP 에게 요청을 한다.
- 위와 같이 필터링을 거치더라도 모든 명령어를 완벽하게 하지 않으면 취약점이 발생하는 것을 알 수 있다.