목차 0. Ransomware 파일 내부 1) file 정보 2) readme.txt 파일 3) run.exe 파일 1. run.exe 파일 실행 1) Exeinfo.exe 설치 2) HxD 설치 3) UPX 설치 4) OllyDbg 설치 5) WOW64 설치 2. IDA run.exe 파일 분석 3. OllyDbg run.exe 파일 분석 4. Key값 구하기 5. 소스코드 정리 및 연산 수행 6. 최종 실행 및 Flag 확인
Network Time Protocol, 가장 오래된 인터넷 프로토콜, 네트워크를 통해 컴퓨터 간 시간 동기화를 위한 네트워크 프로토콜
사용 포트
123/UDP port, CVE-2013-5211
원리
NTP 프로토콜에 '몬리스트(monlist)'라는 명령어를 보냄 'monlist'라는 명령으로 요청받으면, 최근에 해당 서버에 접속한 최대 600개의 호스트들에 대한 최신 정보를 응답으로 보내줌 기본 monlist 요청은 8byte로 가능, 수백~수천 배의 응답
찾는 방법
nmap 등의 스캐닝 툴
예시
프랑스에서 초당 400Gbps 규모의 DDoS 공격 탐지(2014년 2월 13일) NTP 프로토콜을 이용한 증폭 공격 사례 대량의 정보를 요청하는 명령 전송하여 대량의 응답 받음
해결 방안
NTP 서버가 취약한 버전일 경우 NTP-4.2.7p26 이상 버전으로 업그레이드
Intro
NTP에 대해 이해하고 서버 구축하기
서버의 설정
1. NTP 서버 설치
2. 파일 설정(/etc/ntp.conf 변경)
3. 방화벽 허용 및 서비스 시작
클라이언트 설정
1. NTP 서버 상태 확인(ntpq -p)
2. NTP 서버 시간 동기화(ntpdate 서버 IP주소 명령)
NTP 서버 설정
NTP server: 192.168.17.134
NTP client: 192.168.17.145
NTP DRDoS Attack 기본 원리
공격자가 자신의 IP를 희생자 IP(client IP)로 바꿔서 NTP에게 시간을 질의
NTP는 클라이언트에게 시간을 알려줌
해커가 클라이언트 IP로 NTP에게 monlist를 요청
클라이언트에게 600개의 정보가 날라감
yum: Yellowdog Updater Modified, rpm 기반의 시스템을 위한 자동 업데이트 및 패키지 설치/삭제 도구
sudo apt-get install yum
1. 서버 및 클라이언트에 NTP 설치
# yum -y install ntp 혹은
apt install -y ntp
2. NTP 서버 설정
root@ubuntu:/etc# vi ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
driftfile /var/lib/ntp/ntp.drift
# Leap seconds definition provided by tzdata
leapfile /usr/share/zoneinfo/leap-seconds.list
# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
# Specify one or more NTP servers.
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See
http://www.pool.ntp.org/join.html
for
# more information.
pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst
# Use Ubuntu's ntp server as a fallback.
pool ntp.ubuntu.com
# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details. The web page <
http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
# Needed for adding pool entries
restrict source notrap nomodify noquery
# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust
# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255
# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines. Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient
해당 부분 주석 처리하여 설정 변경
# restrict -4 default kod notrap nomodify nopeer noquery limited # restrict -6 default kod notrap nomodify nopeer noquery limited
개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pseudo code 기반 소스코드 작성
목차 0. 파일 버전 확인(32bit, 64bit) 1. 정의된 데이터(db) 2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX 3. 메모리의 구조 1) 코드 영역 2) 데이터 영역 3) 힙 영역 4) 스택 영역 - 레지스터: ESP, EBP, EIP, ECX, EAX 4. IDA 메모리 주소 표시 차이
Distributed Reflection Denial of Service (분산 반사 서비스 거부 공격)
특징
출발지 IP를 위조(Source IP Spoofing)
공격자는 IP를 공격 대상으로 Spoofing, 대량의 공격 요청을 반사 대상(서버 등)에 보냄
→ IP를 기반으로 공격을 방어하거나 공격자 역추적이 어려움
다수의 정상 동작 서버에 공격 트래픽 발생시켜, 정상 트래픽과의 구분이 어려움
공격 트래픽이 수백 Gbps 이상의 대규모로 발생하여, 탐지 하더라도 방어하기 어려움
UDP 기반 증폭 공격
DNS
개념
Domain Name System, 호스트와 도메인 이름과 아이피 주소와의 변환을 수행할 수 있도록 만들어진 주소 변환 프로토콜
사용 포트
53/UDP port, CVE-2006-0987
원리
DNS 레코드 값을 서버에 재귀적인 방식으로 질의를 하여 찾을 수 있음 DNS 서버에 dig 명령을 이용해 ANY 타입의 쿼리로 질의를 보냄(취약한 서버 찾기) DNS 서버는 질의를 받은 도메인과 관련된 모든 타입의 레코드 정보를 보내줌(대량의 응답) * dig 명령: DNS 질의응답이 정상적으로 이루어지는지를 확인 점검하는 경우에 주로 사용
기존 DNS 프로토콜: 512byte로 사이즈 제한 확장 버전인 EDNS: 4096byte까지 전송이 가능하여 더 큰 증폭 효과를 만들 수 있음
찾는 방법
DNS 서버에 dig 명령을 이용해 ANY 타입의 쿼리를 보내 취약한 서버 찾음
NTP
개념
Network Time Protocol, 가장 오래된 인터넷 프로토콜, 네트워크를 통해 컴퓨터 간 시간 동기화를 위한 네트워크 프로토콜
사용 포트
123/UDP port, CVE-2013-5211
원리
NTP 프로토콜에 '몬리스트(monlist)'라는 명령어를 보냄 'monlist'라는 명령으로 요청받으면, 최근에 해당 서버에 접속한 최대 600개의 호스트들에 대한 최신 정보를 응답으로 보내줌 기본 monlist 요청은 8byte로 가능, 수백~수천 배의 응답
찾는 방법
nmap 등의 스캐닝 툴
예시
프랑스에서 초당 400Gbps 규모의 DDoS 공격 탐지(2014년 2월 13일) NTP 프로토콜을 이용한 증폭 공격 사례 대량의 정보를 요청하는 명령 전송하여 대량의 응답 받음
해결 방안
NTP 서버가 취약한 버전일 경우 NTP-4.2.7p26 이상 버전으로 업그레이드
SSDP
개념
Simple Service Discovery Protocol, UPnP(Universal Plug and Play) 프로토콜에서 근거리 혹은 인터넷에 연결된 디바이스를 찾는데 사용되는 프로토콜
사용 포트
1900/UDP port
원리
SSDP를 이용해 네트워크 서버나 정적인 호스트 설정 없이 디바이스 탐지가 가능(like DHCP, DNS) M-Search 메서드를 이용하여 멀티캐스트 방식으로 로컬 네트워크에 연결된 디바이스 조회 가능 응답 패킷에는 다양한 정보 포함(e.g. 헤더, 배너정보 OS, UUID 정보) 40byte 정도의 M-Search 요청에 대해 서버는 평균적으로 30배 이상의 크기를 갖는 응답을 보내줌
찾는 방법
UDP 1900번 포트로 SSDP M-Search 패킷으로 인터넷 스캐닝하여 서버 찾음
SNMP
개념
Simple Network Management Protocol, 네트워크 디바이스를 관리하는 목적으로 만들어진 프로토콜, 네트워크 구성/성능/장비/보안관리가 가능 기존: 네트워크 디바이스의 모니터링은 ICMP와 같은 프로토콜을 사용 신규: 네트워크가 복잡해짐에 따라 더 효율적으로 네트워크 디바이스를 관리하기 위함 대량의 트래픽을 유발하는 명령 전송하여 대량의 응답 받음
사용 포트
161/UDP port
원리
장비 관리에 접근제어는 SNMP 패킷의 community 필드의 값으로, 보통 public과 같은 값으로 세팅 GetBulkRequest 명령을 이용 테이블에 있는 객체데이터를 요청하는 GetBulkRequest 명령을 반복적으로 수행 70byte의 GetBulkRequest 요청으로 최대 수만 byte의 응답을 받음
찾는 방법
community 값을 public으로 SNMP 패킷을 생성하여 스캐닝하여 증폭 공격에 이용 가능한 서버 찾음
Chargen
개념
Character Generator Protocol, 클라이언트의 요청에 대해 랜덤한 개수(0-512)의 문자열을 응답으로 보내주는 프로토콜
사용 포트
19/UDP port (네트워크 연결에 대한 디버깅, 대역폭 테스팅 등에 사용)
원리
60byte의 요청 패킷에 대해 랜덤한(74~1472bytes) 크기의 응답을 보내줌 (수백 배 정도의 증폭 효과)
찾는 방법
nmap 등의 스캐닝 툴
Others
NetBios
PC의 이름 등록(name registration)과 resolution을 수행하는 프로토콜의 디버깅을 위한 nbtstat 명령 이용
약 3배 정도의 증폭 효과
QOTD
Quote Of The Day, CharGen 프로토콜과 거의 유사한 형태
17/UDP port
TCP SYN Flooding
공격자가 IP를 목표물로 설정
반사 서버로 Syn 요청
반사 서버는 목표물에게 SYN+ACK 보냄
일정 시간 이후 목표물이 SYN+ANK 재전송(TCP 연결 특성상)
P2P
프로토콜별 증폭 공격이 가능한 이유, 공격 기법
공격자는 보통 네트워크 스캐너를 이용하여 증폭 공격에 이용할 취약 서버 리스트를 확보
(e.g. 디바이스 검색엔진 Shodan 이용)
과정
증폭 공격에 대한 공격 대상이 네트워크에 존재하는 경우
공격에 사용되는 서버가 네트워크에 존재하는 경우
공격자가 네트워크에 존재하는 경우
보안 대책
ISP에서 IP Spoofing 패킷 진입 불가(Ingress Filtering) 설정
네트워크 보안 장비(e.g. 방화벽)에서 동일 IP에 대해 일정 요청 이상은 차단하도록 설정
NTP의 경우 monlist 기능 비활성화(ntpdc -c monlist (NTP server add))
Proactive Attack Prevention
사전에 DRDoS 증폭 공격을 방어하는 방법
1) IP spoofing을 원천적으로 막는 안티스푸핑(Anti spoofing) 기법 적용
개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기본 데이터/코드 변환 2. 스택/힙 할당 배열 및 구조체 접근
Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음
CMP
esi가 3 이상이면 0으로 초기화
XOR
두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값 → 초기화
MOVZX
소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding
(목적지에 32bit register → 소스에 16bit register)
MOVSX
소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움
(목적지에 32bit register → 소스에 16bit register)
2. 알고리즘 분석
1) v3이 v8의 strlen이 클 때 까지 반복하고, i가 3 이상이면 0으로 초기화
2) sprintf를 통해 Buffer에 생성된 serial 저장
3) "%s%02X"를 통해 기존 Buffer 내용과 v8 포인터 입력값을 한글자씩 가져옴
4) xor 연산을 한 값을 sprintf 함수를 통해 serial이 저장되는 Buffer에 저장
5) serial을 계산하여 scanf로 입력받은 후, strcmp 함수로 동일한지 비교
- if 0일 때 거짓, 0이 아닐 때 참으로 동작하므로, strcmp 내 0일 경우(문자열이 같을 경우) Correct 출력
v6에는 16 → 16 = 0x10
v7[i - 1]가 될 수 있는 값은, v7[0], v7[1], v7[2]의 반복
qmemcpy: sizeof(v7)만큼 " 0" 영역의 값을 v7로 복사
첫번째 인자(v7): 복사받을 메모리를 가리킴
두번째 인자(" 0"): 복사할 메모리를 가리킴
세번째 인자(sizeof(v7)): 복사할 데이터(값)의 길이(바이트 단위)
16진수이므로 두자리씩 끊어서 총 8자리
3. XOR(⊕) 연산의 결합법칙
p
q
p ⊕ q
(p ⊕ q) ⊕ q
T
T
F
T
T
F
T
T
F
T
T
F
F
F
F
F
(p ⊕ q) ⊕ q ≡ p ⊕ (q ⊕ q) ≡ p ⊕ F ≡ p
0x5b^0x10
0x13^0x20
0x49^0x30
0x77^0x10
0x13^0x20
0x5E^0x30
0x7D^0x10
0x13^0x20
4. 소스코드 작성(pseudo code 기반)
# sol1
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []
i_xor = 0
for i_ser in range(len(serial)):
if i_xor >= 3:
i_xor = 0
ans.append(serial[i_ser]^xor[i_xor])
i_xor += 1
print(chr(ans[i_ser]), end='')
# sol2
serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []
for i in range(len(serial)):
ans.append(serial[i]^xor[i%3])
print(chr(ans[i]), end='')
개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기본 데이터/코드 변환 2. 스택/힙 할당 배열 및 구조체 접근
1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.
2) 함수의 작업을 위한 임시 저장소가 필요하다.
* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)
* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가
2. 레지스터: ESP, EBP, EIP, ECX, EAX
예제
32비트 x86 기반 컴퓨터의 컴파일된 함수 코드
void bar(int j, int k); // 호출할 함수
void demo_stackframe(int a, int b, int c) {
int x;
char buffer[64];
int y;
int z;
// 스택 프레임 테스트 용도 외에는 다른 목적이 없는 함수
bar(z, y);
}
지역 변수에 최소 76바이트(3개의 4바이트 정수, 64바이트 버퍼)가 필요
변수
오프셋
ESP 기반 스택 프레임
z
[esp]
지역 변수
y
[esp+4]
buffer
[esp+8]
x
[esp+72]
저장된 eip
[esp+76]
a
[esp+80]
파라미터
b
[esp+84]
c
[esp+88]
모든 오프셋은 ESP가 바뀜에 따라 다시 조절
변수
오프셋
EBP 기반 스택 프레임
z
[ebp-76]
지역 변수
y
[ebp-72]
buffer
[ebp-68]
x
[ebp-4]
저장된 ebp
[ebp]
저장된 레지스터
저장된 eip
[ebp+4]
a
[ebp+8]
파라미터
b
[ebp+12]
c
[ebp+16]
개념 정리
* E: Extended(16bit → 32bit system), 64bit에서는 R로 표현
ESP(stack pointer register)
: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용
- 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦
EBP(base pointer)
: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)
- 스택의 가장 윗 부분, 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터
- 고정적, 코드 유지에 용이(스택프레임 생성시)
EIP(instruction pointer)
: 실행할 명령의 주소
3. 어셈블리어: CMP, LEA, TEST
1) .text:004010B0
디스어셈블리 코드
설명
.text:00401080 var_63
스택 프레임에서 바로 참조할 수 있는 모든 변수의 목록을 변수 크기와 프레임 포인터에서 떨어진 거리와 함께 요약해 보여줌
1. IDA 파일 정보 확인 - IDA 로딩 파일(.idb), 데이터베이스 파일(.id0, .id1, .nam, .til) 2. IDA 툴 기능의 이해 - IDA 데스크탑/그래프 뷰 등 화면 동작/기능 파악 - 데이터 타입/코드 변환 등 설정 대화상자 기능 파악 - pseudo code 조회, 다른 함수로 변환 등 3. 코드 표기 이해(헥사 뷰, 디스어셈블리 뷰 동기화 등)