본문 바로가기

해커의 언어, 치명적 파이썬

2장 침투 테스트

모리스 웜


1. 유닉스의 sendmail 프로그램에 있는 취약점 활용

2. 유닉스 시스템에서 사용하고 있는 finger 데몬(daemon)에 있는 최약점 공격

3. 흔히 사용하는 사용자 이름과 패스워드의 목록 사용, 원격 쉘(RSH)로 공격 대상에 연결 시도

=>이 세 가지 중 하나만 성공해도 웜은 프로그램을 사용하여 바이러스의 나머지 부분을 가져올 수 있었음

 

포트 스캐너 만들기


- 공격 대상에 어떤 공격을 할지 결정하기 전에 취약점을 먼저 확인

- TCP 포트를 찾기 위해 공격 대상 스캔

- 주기적으로 포트 스캔 실시

ex) TCP SYN을 포트에 전송, TCP ACK 응답이 올 때까지 기다리기 =>ACK를 전송 받으면 해당 포트는 열려있는 것

    TCP 커넥트 스캔 => 3방향 핸드셰이크(three-way handshake)를 사용하여 특정 서비스나 포트가 열려있는지 판단

 

TCP 풀 커넥스 스캔

  • BSD 소켓 API를 임포트

  • 호스트 이름과 스캐닝할 포트의 목록 입력

  • 호스트 이름을 IPv4 인터넷 주소로 변환

  • 목록에 있는 각 포트마다 연결 시도

  • 가비지(garbage) 데이터를 전송, 해당 어플리케이션이 전송하는 배너값 읽기

  • 포트에서 실행되고 있는 서비스가 무엇인지 판단

portScanner.py
결과

뭔가 오류가 나지만 port21은 닫혀있다는 것을 확인할 수 있다.

 

쓰레드 사용하기

Thread를 이용한 portScanner
결과

아까부터 같은 곳에서 오류가 나는데 왜인지 모르겠다. 어쨌든 쓰레드를 이용하면 동시에 여러 개의 작업을 진행할 수 있기 때문에 스캔 속도가 빨라지게 된다. 하지만 만약 여러 개의 쓰레드가 결과값을 동시에 화면에 출력하면 알아보기 힘들 수 있고 순서도 안맞는다는 단점이 있다.

 

Nmap 포트 스캐너 통합하기

  • TCP 커넥트 스캔은 제한적인데 반해 Nmap은 ACK, RST, FIN, SYN-ACK 등 다른 종류의 스캔을 지원

  • Nmap은 결과값을 XML 형식으로 생성

  • 파이썬과 궁합이 잘 맞음

nmapScan.py
결과

열심히 쳤지만 인생은 원래 원하는데로 안된다. nmap을 설치해야되는 모양이다.

 

 

파이썬으로 SSH 봇넷 구축하기


->원격 쉘(RSH) 서비스에 일반적으로 사용되는 사용자 이름과 패스워드를 강요하는 기법을 사용.

->시스템 관리자가 원격으로 컴퓨터에 접속, 여러 터미널 명령어로 컴퓨터를 관리할 수 있는 수단 제공.

->트래픽을 안전하게 만들기 위해 공개 키 암호화와 RSH를 함께 사용하는 시큐어 쉘(SSH) 프로토콜이 RSH 대체.

 

Pexpect로 SSH 연결하기

- connect() : 사용자 이름, 호스트 이름, 패스워드를 입력 받아 SSH 통신을 반환하고 SSH 연결로 이어짐.

-  pexpect 라이브러리를 사용, 스크립트는 클라이언트에서 기대하고 있는 결과값을 기다림.

(결과값 : 시간 초과, 다른 호스트에게 새로운 공개 키가 있다는 메시지, 패스워드 프롬프트)

이런걸 하면
이런게 나온다

ssh 보안 설정을 바꾸는 것 같다. 무서워서 못건들였다.

 

pssh.py

스크립트를 실행해보면 원격에 있는 호스트를 제어하기 위해 SSH 서버에 접속할 수 있다.

 

 

Pxssh로 SSH 패스워드 공격하기

Pxssh를 사용하면 앞의 스크립트를 더 간단하게 만들 수 있다. Pxssh는 pexpect 라이브러리에 있는 특화된 스크립트다. SSH 세션과 직접 연동할 수 있는 기능이 있으며 login(), logout(), prompt() 같이 이미 딕셔너리에 정의된 메소드도 있다.

sshBrute.py
결과

도대체 뭐가 잘못된걸까? 하..

 

취약한 개인 키를 통한 SSH 공격하기

서버는 SSH에 로그인할 때, RSA나 DSA 알고리즘을 통해 사용할 수 있는 키들을 생성한다. 1024, 2048, 4096 비트 키를 생성할 수 있기 때문에 이러한 인증 과정은 무차별 대입 공격이 매우 힘들다. 코드 라인에 주석을 추가하면서 검색할 수 있는 키 스페이스 15비트 엔트로피를 없앴다. 키 스페이스가 작아져 BruteForce 공격이 가능해졌다.

 

SSH 봇넷 구축하기

-클래스 객체 Client() : 호스트 사용자 이름, 아이디, 패스워드 또는 키 필요

-클라이언트 유지를 위해 필요한 메소드들 : Connect(), send_command(), alive() 등

-클래스에 속하는 변수를 사용할 때 self와 그 뒤에 변수 이름을 붙여서 호출

-봇넷을 구축하기 위해서 botnet이라는 광역 배열 생성, 개개인의 클라이언트 객체 포함

-addClient() : 호스트, 사용자 이름, 패스워드 | 클라이언트 객체 실체화, 봇넷 배열에 추가

 

botNet.py
결과

pxssh는 어디에 있을까?

 

 

 

FTP와 웹을 이용한 대규모 공격


파일 전송 프로토콜(File Transfer Protocol, FTP) 서비스는 TCP 기반의 네트워크에서 사용자들이 서로 파일을 전송할 수 있도록 해준다. 사용자는 일반적으로 사용자 이름과 패스워드의 조합으로 FTP 서버에 인증한다. 일부 사이트에서는 익명 인증 기능을 제공하는데, 사용자는 사용자 이름에 'anonymous'를 입력하고 패스워드 대신 이메일 주소를 입력한다.

 

파이썬으로 익명 FTP 스캐너 만들기

anonLogin.py
결과

책과는 다르게 Failed가 나왔다. 왜일까?

 

Ftplibe로 FTP 사용자 인증정보 공격하기

익명 접근으로 시스템에 들어갈 수 있지만, 탈취한 인증정보로 FTP 서버에 접근할 수도 있다. FileZilla 같은 FTP 클라이언트 프로그램은 평문으로 된 설정 파일에 패스워드를 저장하기도 한다. 디폴트 폴더에 패스워드가 평문으로 저장되어 있으면 악성코드가 인증정보를 탈취하기에 매우 용이하다.

 

사용자이름/패스워드 조합의 평문으로 된 텍스트 파일
bruteLogin.py
결과

FTP 구축을 해야하나보다.

 

FTP 서버에 있는 웹페이지 검색하기

defaultPages.py
결과

FTP 구축이 안되어있어서 그런지 앞에서부터 차근차근 망하는 중이다. 더 이상 해봤자 의미가 없을 것 같다. 먼훗날 뒷부분까지 해보자.

 

웹 페이지에 악성코드 삽입하기

모든 공격 통합하기

 

컨피커, 노력하면 된다


-일부 고급 기법(디지털 서명, 암호화된 페이로드, 얼터너티브 전파 기법)이 공격에 도움을 줌.

-1988년대의 모리스 웜이 사용하였던 공격 벡터와 매우 유사한 기법이 사용됨.

-두 개의 서로 다른 벡터를 사용하여 공격

 

->윈도우 서버 서비스에 있는 제로 데이(zero-day) 취약점 활용

->스택 변조, 쉘코드 실행

->감염된 호스트에 자신의 복사본을 다운로드하도록 함

->이 공격이 실패하면 디폴트 관리자 네트워크 공유(ADMIN$)의 계정에 무차별 대입 공격, 접근 권환 획득

 

메타스플로잇으로 윈도우 SMB 서비스 공격하기

메타스플로잇 다운로드

http://metasploit.com/download/ 

 

Download Metasploit: World's Most Used Penetration Testing Tool | Metasploit

Pen testing software to act like an attacker. Download Metasploit to safely simulate attacks on your network and uncover weaknesses. Free download.

www.metasploit.com

메타스플로잇은 공격 코드를 표준화되도록 하며 한 번에 수천 개의 컴퓨터를 대상으로 공격을 할 수도 있게 해준다. 메타스플로잇에서 사용자가 명령어를 입력하면서 공격을 실행할 수도 있지만 배치 파일을 통해 공격하는 방법도 있다.

 

-공격 코드 : exploit/windows/smb/ms08_067_netapi

-공격 대상 : 192.168.1.37

-페이로드 : windows/meterpreter/reverse_tcp

-공격자 컴퓨터 : 192.168.77.77 7777번 포트

리버스 연결 지시, 시스템 공격 지시

 

실습 중에 갑자기 토끼가 나왔다. 너무 무섭게 생겼다. 아니 그냥 쟤만 있었으면 괜찮았을텐데 토끼가 낰낰 거린다.

나는 황급히 실습을 중단해야했다.

 

 

제로 데이 개념의 공격 코드 개발하기


  • 컨피커 웜은 스택 변조 취약점 사용

  • 메타스플로잇 프레임워크에는 많은 고유 공격코드가 탑재되어 있으나, 직접 공격코드를 작성해야 할 수도 있음

스택 기반의 버퍼 오버플로우 공격

->사용자가 입력한 값을 검증하지 않음

->그 값이 프로그램의 다음 지시를 가리키는 EIP를 덮어쓰게 됨

->프로그램의 흐름을 제어

-공격코드 : 공격자가 삽입한 쉘코드가 있는 위치로 EIP 레지스터가 포인트하게 만듦

-쉘코드 : 공격대상 시스템에 사용자를 추가, 공격자로 네트워크 연결을 생성, 독립적인 실행 파일을 다운로드

 

 

공격의 핵심 요소 추가하기

->shellcode 변수에 메타스플로잇 프레임워크로 생성한 페이로드를 헥스값으로 인코딩하여 포함

->overflow 변수에 알파벳 "A"(헥스로 \x41)가 246개 포함되도록 함

->return 주소 변수는 스택의 맨 위로 직접 점프하게 만드는 지시가 담겨있는 kernel32.dll의 주소를 포인트

->padding 변수에는 150개의 NOP 지시가 포함

->이러한 모든 변수를 조합, crash라는 변수 하나로 만듦

 

악성코드 전송하기

->Berkeley Socket API로 공격대상 호스트의 TCP 21번 포트에 연결

->연결이 성공하면 익명의 사용자 이름과 패스워드를 호스트에 전송하여 인증

->FTP 명령어인 "RETR"과 crash 변수를 전송

 

사용자 입력값을 제대로 검증하지 않기 때문에 이것은 EIP 레지스터를 덮어쓰는 스택 기반의 버퍼 오버플로우를 발생시킴

>프로그램은 쉘코드로 직접 점프하여 쉘코드를 실행.

'해커의 언어, 치명적 파이썬' 카테고리의 다른 글

6장 정보수집  (0) 2020.03.29
5장 무선 기기 해킹  (0) 2020.03.22
4장 네트워크 트래픽 분석  (0) 2020.03.15
3장 포렌식 수사  (0) 2020.03.15
1장 소개  (0) 2020.03.13