728x90
반응형

Opcode: 스택

x64 아키텍쳐에서는 다음의 명령어로 스택을 조작할 수 있음

push val: val을 스택 최상단에 쌓음 (연산: rsp -= 8, [rsp] = val)

[Register]
rsp = 0x7fffffffc400

[Stack]
0x7fffffffc400 | 0x0 ≦ rsp
0x7fffffffc408 | 0x0

[Code]
push 0x31337

 

해석

rsp(Stack Pointer): 현재 스택의 최상위 주소
rsp 주소에 현재 스택의 최상위 값이 존재 - '0x0'

rsp 주소에서 8바이트(64비트 아키텍처에서는 8바이트가 한 워드) 위로 올라가면 또 다른 8바이트 값이 있음 - '0x0'

스택에 0x31337 푸시 - c400 - c3f8 -> 8만큼 차이

 

결과

[Register]
rsp = 0x7fffffffc3f8

[Stack]
0x7fffffffc3f8 | 0x31337 ≦ rsp
0x7fffffffc400 | 0x0
0x7fffffffc408 | 0x0

 

pop reg: 스택 최상단의 값을 꺼내서 reg에 대입 (연산: reg = [rsp], rsp += 8)

[Register]
rax = 0
rsp = 0x7fffffffc3f8

[Stack]
0x7fffffffc3f8 | 0x31337 <= rsp 
0x7fffffffc400 | 0x0
0x7fffffffc408 | 0x0

[Code]
pop rax

결과

[Register]
rax = 0x31337
rsp = 0x7fffffffc400

[Stack]
0x7fffffffc400 | 0x0 <= rsp 
0x7fffffffc408 | 0x0

 

Opcode: 프로시저

특정 기능을 수행하는 코드 조각

호출(Call): 프로시저를 부르는 행위

반환(Return): 프로시저에서 돌아오는 것

call 다음의 명령어 주소(return address, 반환 주소)를 스택에 저장하고 프로시저로 rip 이동

x64 어셈블리언어에는 프로시저의 호출과 반환을 위한 call, leave, ret 명령어 존재

call addr: addr에 위치한 프로시져 호출

연산: push return_address / jmp addr

예제

[Register]
rip = 0x400000
rsp = 0x7fffffffc400

[Stack]
0x7fffffffc3f8 | 0x0
0x7fffffffc400 | 0x0 <= rsp

[Code]
0x400000 | call 0x401000  <= rip
0x400005 | mov esi, eax
...
0x401000 | push rbp

 

해석

Register(레지스터): rip(명령 포인터 레지스터), rsp(스택 포인터)

after call 0x401000 - 현재 위치의 다음 명령어의 주소(0x400005)가 스택에 푸시됨

rsp는 8만큼 감소하여 스택의 새로운 맨 위를 가리킴

 

결과

[Register]
rip = 0x401000
rsp = 0x7fffffffc3f8

[Stack]
0x7fffffffc3f8 | 0x400005  <= rsp
0x7fffffffc400 | 0x0

[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | push rbp  <= rip

 

leave: 스택프레임 정리

연산: mov rsp rbp / pop rbp

예제

[Register]
rsp = 0x7fffffffc400
rbp = 0x7fffffffc480

[Stack]
0x7fffffffc400 | 0x0 <= rsp
...
0x7fffffffc480 | 0x7fffffffc500 <= rbp
0x7fffffffc488 | 0x31337 

[Code]
leave

 

해석

Register(레지스터): rsp(스택 포인터), rbp(베이스 포인터)

mov rsp, rbp / pop rbp

leave 명령: 현재 함수의 프롤로그에서 설정된 스택 프레임이 제거됨

rsp가 rbp로 복원되고 rbp의 원래 값인 0x7fffffffc500이 rbp로 복원됨

 

결과

[Register]
rsp = 0x7fffffffc488
rbp = 0x7fffffffc500

[Stack]
0x7fffffffc400 | 0x0
...
0x7fffffffc480 | 0x7fffffffc500
0x7fffffffc488 | 0x31337 <= rsp
...
0x7fffffffc500 | 0x7fffffffc550 <= rbp

스택 프레임이란?

함수별로 자신의 지역변수 또는 연산과정에서 부차적으로 생겨나는 임시 값들을 저장하는 영역
스택 영역을 구분 없이 사용한다면, 서로 다른 두 함수가 같은 메모리 영역을 사용할 수 있음

A라는 함수가 B라는 함수를 호출하는데, 같은 스택 영역을 사용한다면 B에서 A의 지역변수를 모두 오염시킬 수 있음, B에서 반환한 뒤 A는 정상적인 연산을 수행할 수 없음

ret: return address로 반환

연산: pop rip

예제

[Register]
rip = 0x401021
rsp = 0x7fffffffc3f8

[Stack]
0x7fffffffc3f8 | 0x400005    <= rsp
0x7fffffffc400 | 0x123456789abcdef

[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | push rbp
0x401001 | mov rbp, rsp
0x401004 | sub rsp, 0x30
0x401008 | mov BYTE PTR [RSP], 0x3
...
0x401020 | leave
0x401021 | ret <= rip

해석

Register: rip(명령 포인터 레지스터), rsp(스택 포인터)

Stack: rsp 주소에 현재 스택의 맨 위 값이 있음, 0x400005
rsp 주소에서 8바이트 아래로 내려가면 다음 슬롯이 있고 값은 0x123456789abcdef

call 0x401000: rip은 0x401000으로 변경됨

call 0x401000: 스택과 레지스터 상태

 

결과

[Register]
rip = 0x400005
rsp = 0x7fffffffc400

[Stack]
0x7fffffffc3f8 | 0x400005
0x7fffffffc400 | 0x123456789abcdef    <= rsp

[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax   <= rip
...
0x401000 | push rbp
0x401001 | mov rbp, rsp
0x401004 | sub rsp, 0x30
0x401008 | mov BYTE PTR [RSP], 0x3
...
0x401020 | leave
0x401021 | ret

 

스택 프레임의 할당과 해제

func 함수를 호출, 다음 명령어의 주소인 0x4000005는 스택에 push

main: rip

stack: rsp(0x7fffffffc400), rbp(0x7fffffffc480)

 

스택

push val: rsp를 8만큼 빼고, 스택의 최상단에 val을 쌓음

pop reg: 스택 최상단의 값을 reg에 넣고, rsp를 8만큼 더함

 

프로시저

call addr: addr의 프로시저 호출

leave: 스택 프레임 정리

ret: 호출자의 실행 흐름으로 돌아감

 

Q1. 레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

[Register]
rbx = 0x401A40

=================================

[Memory]
0x401a40 | 0x0000000012345678
0x401a48 | 0x0000000000C0FFEE
0x401a50 | 0x00000000DEADBEEF
0x401a58 | 0x00000000CAFEBABE
0x401a60 | 0x0000000087654321

=================================

[Code]
1: mov rax, [rbx+8]
2: lea rax, [rbx+8]

0xC0FFEE

 

Q2. Code를 2까지 실행했을 때, rax에 들어있는 값은?

0x401A48

 

Q3. 레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2

=================================

[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A

==================================

[Code]
1: add rax, [rbx+rcx*8]
2: add rcx, 2
3: sub rax, [rbx+rcx*8]
4: inc rax

0x3133A

 

Q4. Code를 3까지 실행했을 때, rax에 저장된 값은?

0

 

Q5. Code를 4까지 실행했을 때, rax에 저장된 값은?

1

 

Q6. 레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

[Register]
rax = 0xffffffff00000000
rbx = 0x00000000ffffffff
rcx = 0x123456789abcdef0

==================================

[Code]
1: and rax, rcx
2: and rbx, rcx
3: or rax, rbx

 

0x1234567800000000

 

Q7. Code를 2까지 실행했을 때, rbx에 저장된 값은?

0x000000009ABCDEF0

 

Q8. Code를 3까지 실행했을 때, rax에 저장된 값은?

0x123456789ABCDEF0

 

Q9. 레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?

[Register]
rax = 0x35014541
rbx = 0xdeadbeef

==================================

[Code]
1: xor rax, rbx
2: xor rax, rbx
3: not eax

0xEBACFBAE

 

35014541

deadbeef

3d 5e (0a) (1d) 4b 5e (4e) (1f)

EB AC FB AE

 

728x90
728x90
728x90
반응형

 

공격자는 비지박스(busybox)라는 리눅스 명령어 패키지를 이용해서 wget 명령으로 악성코드를 다운로드 해 실행

 

x86-64 아키텍처

인텔의 32비트 CPU 아키텍처, 64: CPU가 한번에 처리할 수 있는 데이터의 크기
- 인텔의 x86 아키텍처와 호환되는 64bit 아키텍처 IA-64 발표

Intel 회사에서 개발한 컴퓨터의 중앙처리장치(CPU)
ISA(Instruction Set Architecture)

 

범용 레지스터(General Register)

이름 주용도
rax (accumulator register) 함수의 반환 값
rbx (base register) x64에서는 주된 용도 없음
rcx (counter register) 반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx (data register) x64에서는 주된 용도 없음
rsi (source index) 데이터를 옮길 때 원본을 가리키는 포인터
rdi (destination index) 데이터를 옮길 때 목적지를 가리키는 포인터
rsp (stack pointer) 사용중인 스택의 위치를 가리키는 포인터
rbp (stack base pointer) 스택의 바닥을 가리키는 포인터

세그먼트 레지스터(Segment Register)

x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터 존재

arm, mips, mpsl, x86

 

Q1. rax = 0x0123456789abcedf일 때, eax의 값은?

0x89abcdef

 

Q2. rax = 0x0123456789abcdef일 때, al의 값은?

0xef

 

Q3. rax에서 rbx를 뺐을 때, ZF가 설정되었다. rax와 rbx의 대소를 비교하시오.

==

 

Q4. rax = 0x0123456789abcdef일 때, ax의 값은?

0xcdef

 

Q5. rax = 0x0123456789abcdef일 때, ah의 값은?

0xcd

 

프로세스 메모리 구조

섹션

윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성됨

".text" 섹션: PE코드, 실행 가능한 기계 코드가 위치하는 영역

".data" 섹션: PE가 실행중에 참조하는 데이터, 컴파일 시점에 값이 정해진 전역 변수들이 위치, 읽기/쓰기 권한 부여

".rdata" 섹션: 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보 저장, 읽기 권한 부여(쓰기 불가능), str_ptr: "readonly" 문자열

섹션이 아닌 메모리

윈도우의 가상 메모리 공간에는 섹션 + 스택/힙 등이 적재됨

스택: 지역 변수나 함수의 리턴 주소가 저장됨, 읽기/쓰기 권한 부여 (기존 주소보다 낮은 주소로 확장됨)

어셈블리어와 x86-64

어셈블리 언어

컴퓨터의 기계어와 치환되는 언어, 명령어 집합구조(Instruction Set Architecture, ISA)

x64 어셈블리 언어

명령어(Operation Code, Opcode)와 목적어에 해당하는 피연산자(Operand)

x86-64 어셈블리어 문법 구조

mov eax, 3

(opcode: 대입해라, operand1: eax에, operand2: 3을)

명령어

인텔의 x64에는 매우 많은 명령어가 존재함, 본 커리큘럼에서는 이 코스와 다음 코스에 걸쳐, 이 중 중요한 21개의 명령어를 자세히 학습할 것.

명령 코드  
데이터 이동(Data Transfer) mov, lea
산술 연산(Arithmetic) inc, dec, add, sub
논리 연산(Logical) and, or, xor, not
비교(Comparison) cmp, test
분기(Branch) jmp, je, jg
스택(Stack) push, pop
프로시져(Procedure) call, ret, leave
시스템 콜(System call) syscall

피연산자

상수(Immediate Value), 레지스터(Register), 메모리(Memory)

크기 지정자(Size Directive) TYPE PTR

여기에 타입에는 BYTE, WORD, DWORD, QWORD가 올 수 있으며, 각각 1바이트, 2바이트, 4바이트, 8바이트의 크기 지정

메모리 피연산자의 예

메모리 피연산자  
QWORD PTR [0x8048000] 0x8048000의 데이터를 8바이트만큼 참조
DWORD PTR [0x8048000] 0x8048000의 데이터를 4바이트만큼 참조
WORD PTR [rax] rax가 가르키는 주소에서 데이터를 2바이트 만큼 참조

자료형 WORD의 크기가 2바이트인 이유

초기에 인텔은 WORD의 크기가 16비트인 IA-16 아키텍처를 개발했음
CPU의 WORD가 16비트였기 때문에, 어셈블리어에서도 WORD를 16비트 자료형으로 정의하는 것이 자연스러웠음

이후에 개발된 IA-32, x86-64 아키텍처는 CPU의 WORD가 32비트, 64비트로 확장됨
이 둘의 아키텍처에서는 WORD 자료형이 32비트, 64비트의 크기를 지정하는 것이 당연할 것

하지만 인텔은 WORD 자료형의 크기를 16비트로 유지함 (새로운 아키텍처 호환 여부)

DWORD(Double Word, 32bit), QWORD(Quad Word, 64bit) 자료형을 추가로 만듦

논리 연산 - and & or

# add
[Register]
eax = 0xffff0000
ebx = 0xcafebabe

[Code]
and eax, ebx

[Result]
eax = 0xcafe0000
# or
[Register]
eax = 0xffff0000
ebx = 0xcafebabe

[Code]
or eax, ebx

[Result]
eax = 0xffffbabe

논리 연산 - xor & not

[Register]
eax = 0xffffffff
ebx = 0xcafebabe

[Code]
xor eax, ebx

[Result]
eax = 0x35014541

xor dst, src: dst와 src의 비트가 서로 다르면 1, 같으면 0

- f0 e1 d2 c3 b4 a5

[Register]
eax = 0xffffffff

[Code]
not eax

[Result]
eax = 0x00000000

 

정리

종류 연산자 의미
데이터 이동 연산자 mov dst, src src의 값을 dst에 대입
데이터 이동 연산자 lea dst, src src의 유효 주소를 dst에 대입
산술 연산 add dst, src src의 값을 dst에 더함
산술 연산 sub dst, src src의 값을 dst에서 뺌
산술 연산 inc op op의 값을 1 더함
산술 연산 dec op op의 값을 1 뺌
논리 연산 and dst, src dst와 src가 모두 1이면 1, 아니면 0
논리 연산 or dst, src dst와 src 중 한 쪽이라도 1이면 1, 아니면 0
논리 연산 xor dst, src dst와 src가 다르면 1, 같으면 0
논리 연산 not op op의 비트를 모두 반전
비교 cmp op1, op2 op1에서 op2를 빼고 플래그를 설정
비교 test op1, op2 op1과 op2에 AND 연산을 하고, 플래그를 설정
분기 jmp addr addf로 rip 이동
분기 je addr 직전 비교에서 두 피연산자의 값이 같을 경우 addr로 rip 이동
분기 jg addr 직전 비교에서 두 피연산자 중 전자의 값이 더 클 경우 addr로 rip 이동

 

728x90
728x90
728x90
반응형

전처리(Preprocessing)

컴파일러가 소스 코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 것

add.c를 add.i로 전처리

$ gcc -E add.c > add.i
$ cat add.i

 

컴파일(Compile)

C로 작성된 소스 코드를 어셈블리어로 변역하는 것

소스 코드를 어셈블리 코드로 컴파일: "-S" 옵션

$ gcc -S add.i -o add.S
$ cat add.S

 

어셈블(Assemble)

컴파일로 생성된 어셈블리어 코드를 ELF 형식의 목적 파일(Object file)로 변환하는 과정

* ELF: 리눅스 실행파일 형식, PE: 윈도우 목적 파일 형식

목적 파일 변환 - 어셈블리 코드가 기계어로 번역되므로 더이상 사람이 해석하기 어려워짐

gcc "-c" 옵션을 통해 add.S를 목적 파일로 변환하고, 결과로 나온 파일을 16진수로 출력한 것

링크(Link)

여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정

디컴파일러(Decompiler)

-

정적 분석(Static Analysis), 동적 분석(Dynamic Analysis)

정적 분석

장점

1. 프로그램의 전체 구조를 파악하기 쉬움
2. 분석 환경의 제약에서도 비교적 자유로움
3. 바이러스와 같은 악성 프로그램의 위협으로부터 안전함

단점

1. 난독화(Obfuscation)가 적용되면 분석이 매우 어려워짐

2. 다양한 동적 요소를 고려하기 어려움

동적 분석

장점

1. 코드를 자세히 분석해보지 않고도 프로그램의 개략적인 동작을 파악할 수 있음

단점

1. 분석 환경을 구축하기 어려울 수 있음

2. 안티 디버깅(Anti Debudding)

if (is_debugging())
	exit(-1);
Func();

 

컴퓨터 구조(Computer Architecture)

컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법

폰 노이만 구조, 하버드 구조, 수정된 하버드 구조

명령어 집합구조(Instruction Set Architecture, ISA)

CPU가 처리해야하는 명령어를 설계하는 분야

(e.g., ARM, MIPS, AVR, 인텔의 x86 및 x86-64 아키텍처)

마이크로 아키텍처(Micro Architecture)

정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야

 

> 폰 노이만 구조와 명령어 집합 구조(Instruction Set Architecture) 중 x86-64 아키텍처

폰 노이만: 초기 컴퓨터 과학자 중 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각함

근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(Central Processing Unit, CPU)를, 저장을 위해 기억장치(memory)를 사용함

장치간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용함

중앙처리장치

산술논리장치(Arithmetic Logic Unit, ALU): CPU의 산술/논리 연산 처리

제어장치(Control Unit): CPU 제어

레지스터(Register): CPU에 필요한 데이터 저장

기억장치

컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용됨

주기억장치: 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용 (e.g., 램(Random-Access Memory, RAM)

보조기억장치: 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용 (e.g., 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive))

버스

컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로

데이터 버스(Data Bus): 데이터 이동

주소 버스(Address Bus): 주소 지정

 

  • 범용 레지스터(General Register)
  • 세그먼트 레지스터(Segment Register)
  • 플래그 레지스터(Flag Register)
  • 명령어 포인터 레지스터(Instruction Pointer Register, IP)

 

728x90
728x90
728x90
반응형

 

 

10진 16진 문자 10진 16진 문자 10진 16진 문자 10진 16진 문자
0 0x00 NUL 32 0x20 Space 64 0x40 @ 96 0x60 `
1 0x01 SOH 33 0x21 ! 65 0x41 A 97 0x61 a
2 0x02 STX 34 0x22 " 66 0x42 B 98 0x62 b
3 0x03 ETX 35 0x23 # 67 0x43 C 99 0x63 c
4 0x04 EOT 36 0x24 $ 68 0x44 D 100 0x64 d
5 0x05 ENQ 37 0x25 % 69 0x45 E 101 0x65 e
6 0x06 ACK 38 0x26 & 70 0x46 F 102 0x66 f
7 0x07 BEL 39 0x27 ' 71 0x47 G 103 0x67 g
8 0x08 BS 40 0x28 ( 72 0x48 H 104 0x68 h
9 0x09 TAB 41 0x29 ) 73 0x49 I 105 0x69 i
10 0x0A LF 42 0x2A * 74 0x4A J 106 0x6A j
11 0x0B VT 43 0x2B + 75 0x4B K 107 0x6B k
12 0x0C FF 44 0x2C , 76 0x4C L 108 0x6C l
13 0x0D CR 45 0x2D - 77 0x4D M 109 0x6D m
14 0x0E SO 46 0x2E . 78 0x4E N 110 0x6E n
15 0x0F SI 47 0x2F / 79 0x4F O 111 0x6F o
16 0x10 DLE 48 0x30 0 80 0x50 P 112 0x70 p
17 0x11 DC1 49 0x31 1 81 0x51 Q 113 0x71 q
18 0x12 DC2 50 0x32 2 82 0x52 R 114 0x72 r
19 0x13 DC3 51 0x33 3 83 0x53 S 115 0x73 s
20 0x14 DC4 52 0x34 4 84 0x54 T 116 0x74 t
21 0x15 NAK 53 0x35 5 85 0x55 U 117 0x75 u
22 0x16 SYN 54 0x36 6 86 0x56 V 118 0x76 v
23 0x17 ETB 55 0x37 7 87 0x57 W 119 0x77 w
24 0x18 CAN 56 0x38 8 88 0x58 X 120 0x78 x
25 0x19 EM 57 0x39 9 89 0x59 Y 121 0x79 y
26 0x1A SUB 58 0x3A : 90 0x5A Z 122 0x7A z
27 0x1B ESC 59 0x3B ; 91 0x5B [ 123 0x7B {
28 0x1C FS 60 0x3C < 92 0x5C \ 124 0x7C |
29 0x1D GS 61 0x3D = 93 0x5D ] 125 0x7D }
30 0x1E RS 62 0x3E > 94 0x5E ^ 126 0x7E ~
31 0x1F US 63 0x3F ? 95 0x5F _ 127 0x7F DEL

 

728x90
728x90
728x90
반응형
목차
1. DHCP 개념
2. DHCP 원리
- Discover, Offer, Request, Ack 등
3. DHCP 기능
- 임대(Lease), 갱신(Renewal), 반환(Release)
4. DHCP relay agent
- gi-address
5. DHCP 취약점
- DHCP starvation, DHCP spoofing

DHCP(Dynamic Host Configuration Protocol)

같은 네트워크 대역(LAN)에서 IP를 관리해주는 서버

특정 사용자가 IP가 없을 때, DHCP 서버로부터 요청을 받으면,

몇 번 IP를 얼마 동안 사용하라고 DHCP가 해당 네트워크 서버에서 사용할 수 있는 IP를 빌려줌

같은 네트워크 대역에서 사용할 수 있는 IP 주소를 DHCP 서버가 관리하면, 사용자들이 필요할 때마다 가져가 쓰면 됨

 

DHCP 서버가 없으면 같은 네트워크 대역에서 똑같은 IP를 두 명이 사용하거나, 누가 어떤 IP를 사용하는지 모르니 충돌이 일어날 것

그래서 이러한 IP 주소를 관리하는 서버

- 공유기나 WiFi에 DHCP 서버가 있음

구분 설명
개념 동적 호스트 구성 프로토콜(네트워크 정보 할당)
목적 DHCP 사용 없이 정적(static) 설정해도 되지만, 여러 개의 클라이언트를 관리해야 할 경우, user가 IP를 변경하면 IP 충돌로 관리가 어려움
→ DHCP server를 이용해서 동적으로 제공, 서버에서 관리
원리

Discover 클라이언트가 DHCP 서버를 찾기 위한 패킷, Broadcast로 전송
LAN 상에 DHCP가 있는지 찾는 과정
Offer 서버가 Discover 패킷을 받았으면, 자신이 임대해줄 수 있는 네트워크 정보와 함께 자신의 IP 전달, Broadcast
Request DHCP 서버에서만 패킷 전달, Broadcast
Ack DHCP가 최종적으로 승인을 내리고 네트워크 정보 임대, Broadcast/Unicast
Release client에서 DHCP server에 Binding된 configuration parameter를 해제한다는 message - 네트워크 주소 반환
Nak DHCP server에서 client에게 요구한 시간이 경과했다는 message

기능

초기 설정

ipconfig /release

PC에 부여받은 IP가 0.0.0.0으로 변경(무선 LAN 어댑터 WiFi), 반환 과정과 동일

임대(Lease)

ipconfig /renew

IP를 받는 과정, iptime의 경우 기본적으로 7200초(2시간) 설정

(+ 유동 인구가 많은 카페에 임대 시간을 길게 설정하면 더 이상 제공할 주소가 사라지므로, 적절히 설정)

물리적 네트워크(172.30.1.254) - Vmware 내부 네트워크(192.168.65.1)

갱신(Renewal)

IP 임대 시간 갱신

IP를 임대받은 클라이언트가 계속 사용중이어서 DORA의 과정을 거치면 불필요한 트래픽 발생

(갱신 시도 2회)

1) 임대시간 50% 경과 시, 갱신 시도 → 성공: 설정 임대시간만큼 추가 할당 / 실패: 갱신 보류

2) 임대시간 87.5% 경과 시, 두번째 갱신 시도 → ① 성공: 설정 임대시간만큼 추가 할당 / ② 실패: 갱신 종료

- 전반적인 과정: Unicast 통신 시도(이미 DORA 과정에서 DHCP의 IP를 알아왔으므로), 갱신이 2번 모두 실패할 경우 반환 과정을 거침

ipconfig /all

iptime(192.168.0.1) 고급 설정> 네트워크 관리 > DHCP 서버 설정

KT(172.30.1.254:8899) 장치설정 > 네트워크 관리 > LAN 연결 설정

DHCP 갱신

반환(Release)

ipconfig /release

DHCP에게 할당 받았던 IP 반환(갱신 과정 실패 시)

임대 시간이 모두 지났는데 Client와 DHCP server끼리 통신이 되지 않는 경우, DHCP는 반환받은 것으로 처리


DHCP relay agent

일반적으로 DHCP 메시지는 Broadcasting 되기 때문에 단말과 DHCP 서버는 반드시 동일 서브넷 상에 위치해야 함

(라우터가 브로드캐스트 패킷을 다른 인터페이스로 전달(IP Forwarding)하지 않기 때문)

단말이 송신한 DHCP 메시지(브로드캐스트 패킷)가 라우터를 통해 다른 서브넷에 위치한 DHCP 서버로 전달될 수 없음

그러나, DHCP 서버가 각 subnet(LAN) 마다 위치하는 것은 실제 통신 사업자망의 구성에 실용적이지 못함

→ DHCP Relay Agent 기능으로, 단말이 송신하는 DHCP Broadcast packet을 Unicast로 변환하여 DHCP 서버에 전달(L2 Switch)

구분   설명
Discover
기본 클라이언트가 DHCP 서버를 찾기 위한 패킷, Broadcast로 전송
LAN 상에 DHCP가 있는지 찾는 과정
변환 단말이 브로드캐스트 메시지를 보내면, DHCP Relay Agent가 수신하여 유니캐스트로 변환
(SIP=DHCP Relay Agent, DIP=DHCP Server) → DHCP 서버로 전달
Offer
기본 서버가 Discover 패킷을 받았으면, 자신이 임대해줄 수 있는 네트워크 정보와 함께 자신의 IP 전달, Broadcast
변환 DHCP 서버가 DHCP Relay Agent로 유니캐스트를 보내면,
이를 수신한 DHCP Relay Agent는 브로드캐스트로 변환해서 단말로 전송
Request
기본 DHCP 서버에서만 패킷 전달, Broadcast
변환 단말이 브로드캐스트 메시지를 보내면 DHCP Relay Agent가 수신해서 유니캐스트로 변환
(SIP=DHCP Relay Agent, DIP=DHCP Server) → DHCP 서버로 전달
Ack
기본 DHCP가 최종적으로 승인을 내리고 네트워크 정보 임대, Broadcast/Unicast
변환 DHCP 서버가 DHCP Relay Agent로 유니캐스트를 보내면,
이를 수신한 DHCP Relay Agent는 브로드캐스트로 변환해서 단말로 전송

* Request Broadcast 이유: 모든 DHCP 서버들이 DHCP Offer 메시지를 보내면서 해당 단말에 할당해 줄 IP 주소와 기타 정보를 내부적으로 저장해 놓기 때문, 선택받지 못한 DHCP 서버들이 이 IP 주소와 기타 정보들을 삭제할 수 있도록 하기 위함

# apt-get install isc-dhcp-server
# vi /etc/dhcp/dhcpd.conf

# 해당 옵션 추가(network range)
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.10 192.168.0.20;
}
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.10 192.168.1.20;
}
# systemctl restart isc-dhcp-server
# ps -ef | grep dhcrelay

# apt-get install isc-dhcp-relay

# vi /etc/default/isc-dhcp-relay
SERVERS="192.168.0.1"
INTERFACES="eth0 eth1"

SERVERS: relay할 서버 설정, 여러개의 DHCP 서버로 relay 가능(space-seperated)

INTERFACES: relay service를 할 interface 설정, DHCP와 통신할 interface도 추가해야 하므로 2개 설정

# systemctl restart isc-dhcp-relay
# ps -ef | grep dhcrelay

gi-address

DHCP 패킷 테이블에 나열된 필드 중 하나

라우터 IP 주소, DHCP/BootP 릴레이 에이전트에 의해 채워지는 게이트웨이 IP 주소

DHCP server가 메시지에 대한 reply 패킷을 송신할 때, destination address를 'giaddr'로 사용

DHCP server가 DHCP Relay Agent로부터 DHCP 메시지를 수신하면, 메시지에 대한 reply를 giaddr(Gateway IP Address)로 보냄

 

부가 설명

Relay Agent가 request를 relay하기로 정했으면, 반드시 'giaddr' 필드를 검사해야 함

만약 'giaddr' 필드가 '0'이면, Relay Agent는 request를 'giaddr' 필드를 request를 수신한 인터페이스의 IP 주소로 채워야 함

즉, 'giaddr' 필드는 dhcrelay 데몬의 To client 인터페이스의 IP 주소가 됨

DHCP Server는 'giaddr'로 DHCP reply 패킷을 송신 DHCP Server가 DHCP 메시지를 수신하지만, DHCP Relay Agent로 reply 패킷이 도달하지 않는다면 DA가 'giaddr'인 패킷을 수신할 수 있도록 네트워크를 변경해야 함

 

게이트웨이 주소(gi addr)에서 DHCP

DHCP: IP 주소 관리의 효율성과 편의를 위한 프로토콜

DHCP는 네트워크 내 개별 호스트 TCP/IP 통신을 실행하기 위한 IP 주소를 자동으로 할당(+ 구성 정보, ...)

단점: 서버와 클라이언트간 상호 인증 체계가 없음

-> DHCP spoofing, release 공격과 같은 네트워크 공격에 취약


취약점

DHCP Starvation

dhcpx -vv -i eth1 -A -D 10.10.10.50 -t 1
(축약) dhcpx -i eth1 -D 10.10.10.50
(eth1: 공격 보낼 network interface), 10.x.x.x: 공격 대상(DHCP 서버))

(DHCP pool 고갈 = IP 고갈)

대응

1) port security(switch 기술)(Client-Switch 사이)

특정 LAN 포트에서 허용할 MAC Address 지정(개수 포함)

발견 시 ① Protect(blocking) ② Restrict (blocking + trap message 관리자 전송) ③ Shutdown (위반 시 포트 차단 - 관리자 no shut 해제)

2) trusted port(DHCP Server-Switch 사이)

다른 포트에서 들어오는 DHCP 패킷이 감지되면, 패킷 버림 (물리적인 포트)

 

DHCP Spoofing

ettercap -i eth1 -T -M dhcp: 10.10.10.60 -150 / 255.255.255.0 / 10.10.10.50
(ettercap: LAN에 대한 메시지 가로채기 공격을 위한 보안 도구
IP 순서대로 (할당할 IP 대역 / 서브넷 마스크 / DNS Server)

참고: kali linux → dhcp server spoofing & starving attack

DHCP server의 취약점 판단하여 공격자가 DHCP 서버가 되어, 패킷 스푸핑

(DHCP 서버가 Default GW, DNS Server까지 할당 가능 → 공격자가 만든 서버 참조


참고 자료

유권정, 김은기, 네트워크 공격 방지를 지원하는 DHCP의 설계 및 구현에 관한 연구, 한국정보통신학회논문지

DHCP Packet 분석

DHCP 성능 테스트

DHCP Relay Agent 이용

 

 

728x90
728x90
728x90
반응형
목차
1. APK 추출하기
2. JAR 변환하기
3. JAR 디컴파일
-
1. dex2jar download
  - apk/dex to jar
2. mapping download
  - proguard reverse
3. JD-GUI download
  - 소스코드 조회
4. AXMLPrinter2.jar download
  - packageinfo(for AndroidManifest.xml)
5. apktool download

개발자가 구현한 JAVA 코드 및 라이브러리가 APK 파일로 컴파일됨

안드로이드 가상머신에서 실행되는 DEX "classes.dex"로 저장됨

DEX를 직접 디컴파일하는 것보다, JAVA 디컴파일러로 열어보기 위해 JAR로 변환하는 작업을 진행할 것

APK(DEX)를 JAR로 변환하기 위해 DEX2JAR 사용

1. dex2jar download

https://github.com/pxb1988/dex2jar

 

다운로드 이후, 명령 프롬프트의 해당 동일 경로에 apk 파일 위치시키고, 코드 입력하여 확장자 변경

// - Linux: APK/DEX를 JAR로 변환
dex2jar -f -o app.jar app.apk
dex2jar -f -o app.jar app.dex

// - Windows
d2j-dex2jar.bat app.apk
d2j-dex2jar.bat app.dex

* DEX란? Dalvik Executable, 안드로이드의 실행 파일(윈도우 실행파일: PE)

다음과 같이 jar 파일 생성되는 것을 확인


2. mapping download

mapping.jar
0.67MB

명령 프롬프트에 아래와 같이 입력 후, 

java -jar mapping.jar​

Mapping Utility에

Load Jar: 언패킹할 jar 파일(e.g. app-dex2jar.jar)

Load Mappings: mapping.jar 파일 입력 후

Proguard Reverse 버튼 누르면,

다음과 같이 app-dex2jar.jar.correlated.jar 파일 생성

이후 jd-gui 프로그램 사용하여 소스코드 확인


3. JD-GUI download

http://java-decompiler.github.io/

jd-gui-windows-1.6.6.Zip
1.30MB

dex2jar를 사용하기 위해서는 apk 파일 또는 apk 내부 classes.dex 파일을 인자값으로 전달하면 됨

exe 파일 실행하여 jar 파일 open

해당 앱은 proguard로 난독화를 수행하지 않았는지.. mapping 이전과 이후 코드가 동일하게 나타남


4. AXMLPrinter2.jar download

AXMLPrinter2.jar
0.02MB

apk 파일 내에 있는 AndroidManifest.xml 파일을 가져와서, AXMLPrinter2.jar 파일 동일 경로에 위치

이후 다음 명령어 입력

(apkinfo.txt: 패키지 파일 내부를 확인할 수 있는 텍스트 파일 형식으로, 파일명은 임의로 지정)

java -jar AXMLPrinter2.jar AndroidManifest.xml > apkinfo.txt

다음과 같이 apkinfo.txt 파일이 생성되며, 패키지명 등 확인 가능


5. apktool download

https://ibotpeaches.github.io/Apktool/

apktool_2.6.1.jar
19.06MB

java -jar apktool_2.6.1.jar d app.apk

 

 

728x90
728x90
728x90
반응형

apk 파일이란?

Android Package Kit, Google의 Android OS에 애플리케이션을 배포하는 데 사용되는 Android 패키지 파일의 확장

Windows OS의 소프트웨어 설치를 위한 exe 파일과 동일한 유형

안드로이드 프로그램 애플리케이션의 모든 데이터 포함

 

Windows에서 APK 파일을 열기 위해서는 Android Studio와 같은 cross platform 개발 환경 필요

text 형식으로 파일을 오픈할 경우
Stay in LightEdit 버튼 클릭
파일이 binary 형식으로 열려 깨짐

APK Analyzer로 빌드 분석 방법

https://developer.android.com/studio/debug/apk-analyzer?hl=ko 

 

APK Analyzer로 빌드 분석  |  Android 개발자  |  Android Developers

Android 스튜디오에는 빌드 프로세스가 완료된 후 APK 구성에 관한 유용한 정보를 즉시 제공하는 APK Analyzer가 포함됩니다.

developer.android.com

 

압축 해제하여 내부 폴더/파일 및 소스 코드 조회

Android.apk folder  
META-INF 서명 및 아카이브의 리소스 목록, 매니페스트 파일 포함
lib 장치의 특정 아키텍처에서 실행되는 기본 라이브러리
res resources.arsc로 컴파일되지 않은 리소스(e.g. image)
assets 번들로 제공하는 리소스의 원시 파일(개발자가 앱과 함께 제공)
r 안드로이드 개요 참조? xml 파일 (http://schemas.android.com/apk/res/android)
Android.apk file  
AndroidManifest.xml APK 파일의 콘텐츠, 버전, 이름에 대한 설명 제공
class.dex 컴파일된 Java 클래스(기기 내 실행)
resources.arsc 앱에서 사용하는 컴파일된 리소스(e.g. 문자열)

 

eyes sources > assets > web > login.html 내 내부 연결 사이트 존재

		<div class="row footer">
			 <div class="sns"><!-- target="_blank"  -->
			 	<a href="http://m.facebook.com/pages/%EA%B3%B5%EC%A6%9D%EC%A0%9C%EB%8F%84%ED%99%8D%EB%B3%B4/455469054516582?ref=hl" class="ic-sns ic-sns-f mr-20" target="_blank"></a>
			 	<a href="http://pf.kakao.com/_GSxeTC" class="ic-sns ic-sns-p mr-20" target="_blank" ></a>
			 	<a href="http://m.blog.naver.com/notary_legal" class="ic-sns ic-sns-n" target="_blank" ></a>
			 </div>

법무부 공식 페이지 URL과 상이하며, 현재 카카오톡 채널은 비공개 혹은 삭제된 프로필로 표시

 

eyes sources > assets > web > end.html 내 코드

기타 버튼을 누를 경우, 법무부 전자공증시스템(공식 홈페이지, enotary.moj.go.kr) 연결

<div class="panel-group" id="menus">
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#menus" href="#menu1">내 신청내역
               <i class="menu-in"></i>
            </a>
         </h4>
      </div>
      <div id="menu1" class="panel-collapse collapse in">
      
         <div class="panel-body text-center">
            <p>로그인을 하시면 편리한 화상공증 서비스를</p>
            <p>이용하실 수 있습니다.</p>
            <a href="https://enotary.moj.go.kr/mobile/login.jsp" class="btn btn-sidebar-login">로그인</a>
         </div>
      
      </div>
   </div>
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-parent="#menus" href="https://enotary.moj.go.kr/mobile/office_search/office_search.jsp">사무소 찾기
               <i class="menu-out"></i>
            </a>
         </h4>
      </div>
   </div>
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#menus" href="#menu3">공증안내
               <i class="menu-out"></i>
            </a>
         </h4>
      </div>
      <div id="menu3" class="panel-collapse collapse">
         <div class="panel-body">
            <ul>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/about.jsp"><li>공증제도</li></a>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/law.jsp"><li>공증법령</li></a>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/guide.jsp"><li>전자공증안내</li></a>
               <a href="https://enotary.moj.go.kr/mobile/enotary_guide/howtouse.jsp"><li>전자공증이용방법</li></a>
            </ul>
         </div>
      </div>    
   </div>
   <div class="panel panel-dafault">
      <div class="panel-heading">
         <h4 class="panel-title">
            <a data-toggle="collapse" data-parent="#menus" href="#menu4">고객센터
               <i class="menu-out"></i>
            </a>
         </h4>
      </div>
      <div id="menu4" class="panel-collapse collapse">
         <div class="panel-body">
            <ul>
               <a href="https://enotary.moj.go.kr/mobile/customer/notice.jsp"><li>공지사항</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/uselist.jsp"><li>전자공증 활용사례</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/util.jsp"><li>자료실</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/qa.jsp"><li>Q&amp;A</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/faq.jsp"><li>FAQ</li></a>
               <a href="https://enotary.moj.go.kr/mobile/customer/documents.jsp"><li>공증사무소 방문 시 지참서류</li></a>
               <a href="javascript:setGongin();" id="gongin"><li>공인인증센터</li></a>
               <script>
                  function setGongin(){
                     location.href = "https://enotary.moj.go.kr/mobile/customer/gongin.jsp"
                  }
               </script>
            </ul>
         </div>
      </div>
   </div>
</div>

프로그램 보안 검사

전체 251개의 앱을 검사하는 과정이며, 내부 악성 앱을 설치하는 요소가 포함되는지 확인

// 2.html file
<body>
  <div class="main" id="app">
    <div class="center-img display-flex flex-align-center flex-justify-center ">
      <img src="./img/ic_launcher_round.png" alt="">
    </div>
    <div class="folder-text fontSize-14 text-center">{{`설치된 ${total}개의 앱중에서 ${num}번째 앱을 검사 중입니다.`}}</div>
    <div class="folder-loop fontSize-12 text-center">
      {{folderText}}
    </div>
  </div>

// ----------

data() {
  return {
    total: 251,
    num: 0,
    folderText: '',
    json: [
      "com.google.omadm.trigger",
      "com.google.android.carriersetup",
      "com.android.cts.priv.ctsshim",
      "com.google.android.youtube",
      "com.vzw.apnlib",
      "com.android.internal.display.cutout.emulation.corner",
      "com.google.android.ext.services",
      "com.android.internal.display.cutout.emulation.double",
      "com.google.android.overlay.pixelconfig2017",
      "com.google.android.overlay.pixelconfig2018",
      "com.android.providers.telephony",
      "com.android.dynsystem",
      "com.android.sdm.plugins.connmo",
      "com.google.android.googlequicksearchbox",
      "com.android.providers.calendar",
      "com.android.providers.media",
      "com.google.android.apps.docs.editors.docs",
      "com.google.android.onetimeinitializer",
      "com.google.android.ext.shared",
      "com.android.internal.systemui.navbar.gestural_wide_back",
      "com.quicinc.cne.CNEService",
      "com.estsoft.alyac",
      "com.android.theme.color.cinnamon",
      "com.google.android.apps.diagnosticstool",
      "com.google.euiccpixel",
      "com.android.theme.icon_pack.rounded.systemui",
      "com.android.simappdialog.auto_generated_rro_product__",
      "com.android.safetyregulatoryinfo.auto_generated_rro_product__",
      "com.android.externalstorage",
      "com.google.android.apps.enterprise.dmagent",
      "com.android.htmlviewer",
      "com.qualcomm.qti.uceShimService",
      "com.android.companiondevicemanager",
      "com.verizon.obdm_permissions",
      "com.android.mms.service",
      "com.android.providers.downloads",
      "com.google.android.cbrsnetworkmonitor",
      "com.android.sdm.plugins.usccdm",
      "com.android.systemui.auto_generated_rro_product__",
      "com.google.android.apps.messaging",
      "com.google.android.soundpicker",
      "com.android.theme.icon_pack.rounded.android",
      "com.breel.wallpapers18",
      "com.qualcomm.qti.telephonyservice",
      "com.android.theme.icon_pack.circular.themepicker",
      "com.google.android.configupdater",
      "com.google.android.overlay.googlewebview",
      "com.google.android.apps.safetyhub",
      "com.android.timezone.updater",
      "com.google.ar.core",
      "com.android.providers.downloads.ui",
      "com.android.vending",
      "com.android.pacprocessor",
      "com.android.simappdialog",
      "com.nuts.extremspeedup",
      "com.android.internal.display.cutout.emulation.tall",
      "com.android.certinstaller",
      "com.android.theme.color.black",
      "com.google.android.marvin.talkback",
      "com.android.theme.color.green",
      "com.android.theme.color.ocean",
      "com.android.theme.color.space",
      "com.android.internal.systemui.navbar.threebutton",
      "com.google.android.apps.work.oobconfig",
      "com.qti.qualcomm.datastatusnotification",
      "com.google.android.pixel.setupwizard",
      "com.android.theme.icon_pack.rounded.launcher",
      "com.google.android.grilservice",
      "com.android.egg",
      "com.android.mtp",
      "com.android.nfc",
      "com.android.ons",
      "com.android.stk",
      "com.android.backupconfirm",
      "com.android.theme.font.arvolato",
      "com.android.systemui.auto_generated_rro_vendor__",
      "com.google.android.deskclock",
      "com.android.internal.systemui.navbar.twobutton",
      "com.android.statementservice",
      "com.android.hotspot2",
      "com.google.android.as",
      "com.google.android.gm",
      "com.google.android.carrier",
      "com.google.android.apps.tachyon",
      "com.android.sdm.plugins.sprintdm",
      "com.android.internal.systemui.navbar.gestural_extra_wide_back",
      "com.google.android.permissioncontroller",
      "com.google.intelligence.sense",
      "com.google.android.setupwizard",
      "com.qualcomm.qcrilmsgtunnel",
      "com.android.providers.settings",
      "com.android.sharedstoragebackup",
      "com.verizon.services",
      "com.android.nfc.auto_generated_rro_product__",
      "com.google.android.euicc",
      "com.google.android.music",
      "com.android.printspooler",
      "com.android.hotwordenrollment.okgoogle",
      "com.android.sdm.plugins.diagmon",
      "com.android.theme.icon_pack.filled.settings",
      "com.android.dreams.basic",
      "com.android.providers.settings.auto_generated_rro_product__",
      "com.android.se",
      "com.android.inputdevices",
      "com.google.android.apps.wellbeing",
      "com.google.android.dialer",
      "com.android.bips",
      "com.google.audio.hearing.visualization.accessibility.scribe",
      "com.google.android.captiveportallogin",
      "com.android.theme.icon_pack.circular.settings",
      "com.google.android.accessibility.soundamplifier",
      "com.qti.xdivert",
      "com.android.musicfx",
      "com.google.android.apps.docs",
      "com.google.android.apps.maps",
      "com.google.android.apps.tips",
      "com.google.android.documentsui.theme.pixel",
      "com.google.android.modulemetadata",
      "com.android.bluetooth.auto_generated_rro_vendor__",
      "com.google.android.markup",
      "com.android.providers.settings.auto_generated_rro_vendor__",
      "com.android.cellbroadcastreceiver",
      "com.google.android.webview",
      "com.android.theme.icon.teardrop",
      "com.google.android.apps.carrier.log",
      "com.google.android.networkstack",
      "com.google.android.contacts",
      "com.android.server.telecom",
      "com.google.android.syncadapters.contacts",
      "com.android.theme.icon_pack.rounded.themepicker",
      "com.android.keychain",
      "com.android.server.tele",
      "com.auto_generated_rro_product__",
      "com.google.android.overlay.googleconfig",
      "com.google.android.calculator",
      "com.android.service.ims",
      "com.android.chrome",
      "com.android.bips.auto_generated_rro_product__",
      "com.android.theme.icon_pack.filled.systemui",
      "com.google.android.packageinstaller",
      "com.google.android.apps.customization.pixel",
      "com.google.android.gms",
      "com.google.android.gsf",
      "com.google.android.ims",
      "com.google.android.tag",
      "com.google.android.tts",
      "com.google.android.overlay.permissioncontroller",
      "com.android.calllogbackup",
      "com.google.android.partnersetup",
      "com.android.safetyregulatoryinfo",
      "com.google.android.apps.wallpaper.nexus",
      "com.android.dynsystem",
      "com.android.sdm.plugins.connmo",
      "com.google.android.googlequicksearchbox",
      "com.android.providers.calendar",
      "com.android.providers.media",
      "com.google.android.apps.docs.editors.docs",
      "com.google.android.onetimeinitializer",
      "com.google.android.ext.shared",
      "com.android.internal.systemui.navbar.gestural_wide_back",
      "com.quicinc.cne.CNEService",
      "com.estsoft.alyac",
      "com.android.theme.color.cinnamon",
      "com.google.android.apps.diagnosticstool",
      "com.google.euiccpixel",
      "com.android.theme.icon_pack.rounded.systemui",
      "com.android.simappdialog.auto_generated_rro_product__",
      "com.android.safetyregulatoryinfo.auto_generated_rro_product__",
      "com.android.externalstorage",
      "com.google.android.apps.enterprise.dmagent",
      "com.android.htmlviewer",
      "com.qualcomm.qti.uceShimService",
      "com.android.companiondevicemanager",
      "com.verizon.obdm_permissions",
      "com.android.mms.service",
      "com.android.providers.downloads",
      "com.google.android.cbrsnetworkmonitor",
      "com.android.sdm.plugins.usccdm",
      "com.android.systemui.auto_generated_rro_product__",
      "com.google.android.apps.messaging",
      "com.google.android.soundpicker",
      "com.android.theme.icon_pack.rounded.android",
      "com.breel.wallpapers18",
      "com.qualcomm.qti.telephonyservice",
      "com.android.theme.icon_pack.circular.themepicker",
      "com.google.android.configupdater",
      "com.google.android.overlay.googlewebview",
      "com.google.android.apps.safetyhub",
      "com.android.timezone.updater",
      "com.google.ar.core",
      "com.android.providers.downloads.ui",
      "com.android.vending",
      "com.android.pacprocessor",
      "com.android.simappdialog",
      "com.nuts.extremspeedup",
      "com.android.internal.display.cutout.emulation.tall",
      "com.android.certinstaller",
      "com.android.theme.color.black",
      "com.google.android.marvin.talkback",
      "com.android.theme.color.green",
      "com.android.theme.color.ocean",
      "com.android.theme.color.space",
      "com.android.internal.systemui.navbar.threebutton",
      "com.google.android.apps.work.oobconfig",
      "com.qti.qualcomm.datastatusnotification",
      "com.android.hotwordenrollment.xgoogle",
      "com.google.android.pixel.setupwizard",
      "com.android.theme.icon_pack.rounded.launcher",
      "com.google.android.grilservice",
      "com.android.egg",
      "com.android.mtp",
      "com.android.nfc",
      "com.android.ons",
      "com.android.stk",
      "com.android.backupconfirm",
      "com.android.theme.font.arvolato",
      "com.android.systemui.auto_generated_rro_vendor__",
      "com.google.android.deskclock",
      "com.android.statementservice",
      "com.android.hotspot2",
      "com.google.android.as",
      "com.google.android.gm",
      "com.google.android.carrier",
      "com.google.android.apps.tachyon",
      "com.android.sdm.plugins.sprintdm",
      "com.android.internal.systemui.navbar.gestural_extra_wide_back",
      "com.google.android.permissioncontroller",
      "com.google.intelligence.sense",
      "com.google.android.setupwizard",
      "com.qualcomm.qcrilmsgtunnel",
      "com.android.providers.settings",
      "com.android.sharedstoragebackup",
      "com.verizon.services",
      "com.android.nfc.auto_generated_rro_product__",
      "com.google.android.euicc",
      "com.google.android.music",
      "com.android.printspooler",
      "com.android.hotwordenrollment.okgoogle",
      "com.android.sdm.plugins.diagmon",
      "com.android.theme.icon_pack.filled.settings",
      "com.android.dreams.basic",
      "com.android.providers.settings.auto_generated_rro_product__",
      "com.android.se",
      "com.android.inputdevices",
      "com.google.android.apps.wellbeing",
      "com.google.android.dialer",
      "com.google.android.dialer",
      "com.android.bips",
      "com.google.audio.hearing.visualization.accessibility.scribe"
    ]
  }

eyes sources > assets > web > url.html 내 내부 연결 사이트 존재

화상공증 요청 시도 시 해당 피싱 사이트로 리다이렉트

(국가별 최상위 도메인(국가 코드)가 CC: 코코스 제도)

<script>
//alert("화상공증 요청을 신청햇습니다 .\n 잠시만 대기해 주시면 영상요청이  들어옵니다.")
window.location.href = "http://nimabi7.gnway.cc/seoul/kics/login.html";

 

내부 secret-classes.dex 파일 내 악성 코드 존재, 복호화하는 과정 관련 키 값이 포함되지 않아 정적 분석 불가

 

eyes apk > AndroidManifest.xml 파일: 악성 앱이 요구하는 권한

(네트워크 연결 상태 정보, foreground 서비스, 휴대전화 번호, 앱 설치/삭제 권한 등)


두번째 파일, ibk apk 분석

내부 rmDDnx.apk, tefwMF.apk 파일 존재

해당 apk 파일 우클릭하여 Open In > File Path (Ctrl + Alt + F12)

내부 파일 구조 비교

assets 내 mp3 파일: 상담센터 ARS 음성 파일(금감원, 우리은행, 신한은행, SBI저축은행, NH농협 캐피탈 등)

 

AndroidManifest.xml 파일 내부에, 악성 앱이 요구하는 권한은 eyes apk 파일과 유사하며

초기 접근 시 사용자 계정 컨트롤 설정(디바이스를 변경할 수 있도록 허용할지)에 해당하는 권한이 포함된 정보들 존재)

 

728x90
728x90
728x90
반응형

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 이상 버전으로 업그레이드

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

 

192.168.17.0/16 네트워크에서의 NTP 요청 허용

restrict 192.168.17.0 mask 255.255.255.0 nomodify notrap

service ntp restart

 

Kali에서 ntp-monlist scan 시 다음과 같이 filtered

서버 iptables 기본 설정(NTP port: 123/UDP)

iptables -I INPUT 1 -p udp --dport 123 -j ACCEPT

script output


참고 자료

NTP 서버 구축 및 관리

NTP DrDoS Attack

NTP 증폭 공격

 

728x90
728x90
728x90
반응형

DRDoS 개념

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) 기법 적용

2) 프로토콜 취약점을 패치

 

1. 안티 스푸핑(Anti-Spoofing)

: 인증을 이용한 안티 스푸핑 기법

1) 세션 토큰을 이용한 인증

2) 암호화 기법을 이용한 인증

3) 제삼자(third-party)를 이용한 인증

성능 상의 오버헤드나 추가적으로 트래픽 발생

 

2. 네트워크 토폴로지를 이용한 방법

 


[참조]

 

최현상,박현도,이희조, "DRDoS 증폭 공격 기법과 방어 기술 연구(A Study on Amplification DRDoS Attacks and Defenses)", 한국정보전자통신기술학회논문지, 15-08-05-429 Vol.8 No.5 (2015), 9page.

 

김효종, 한군희, 신승수, "DRDoS 증폭 공격 대응 시스템(Response System for DRDoS Amplification Attacks)", 융합정보논문지(Journal of Convergence for Information Technology), Vol.10 No12 (2020), 22~30page

 

 

728x90
728x90

+ Recent posts