단순 xor 역연산이다. 알고 있는 값들을 토대로 하나씩 xor 역연산 해가면서 찾아나아가면 된다. 참고로 S[0] = "LINECTF{" 임을 알고 있으면 된다.
X Factor
rsa blind signature attack 같은 느낌인데 sign을 해주는 기능을 제공해주지는 않는다. 대신 plain -> signature pair들을 제공해주기 때문에 이 값들을 sign함수 대신 사용하는 느낌으로 가야된다. 0x686178656c696f6e 값의 signature를 구하는 문제이다.
문제 제목이 힌트라고 볼 수 있는데, 각 plain 값들을 소인수분해한다. 이는 factordb 사이트를 이용하면 된다. a ~ g의 값들을 사용하여 Z를 만들어내려면 ( f * b * g * d * g * d ) / ( c * e * a ) 가 된다.
plain a ~ g, Z의 signature 값을 Sa ~ Sg, SZ 라고 하면, 위 사진의 식에서 M=Z = ( f * b * g * d * g * d ) / ( c * e * a ) , r= Sc * Se * Sa r^e mod N = c * e * a 이므로 M' = ( f * b * g * d * g * d ) / ( c * e * a ) * (c * e * a) mod N = ( f * b * g * d * g * d )
S' = M'^d mod N = ( f * b * g * d * g * d )^d mod N = ( Sf * Sb * Sg * Sd * Sg * Sd ) mod N
우리가 원하는 S = S'/r mod N = ( ( Sf * Sb * Sg * Sd * Sg * Sd ) / ( Sc * Se * Sa ) ) mod N 이다.
https://ohgym.tistory.com/13, 모듈로 나눗셈 성질
( Sc * Se * Sa ) 의 역원을 구해야 한다.
https://ohgym.tistory.com/13
( Sc * Se * Sa ) 와 N 은 서로소이므로 확장된 유클리드 호제법을 사용하여 역원 x를 구한다.
처음에 크립토 잡고 풀다가 하루 다 보내버리고 뒤늦게 웹에 합류하여 문제를 풀었다. 좀 더 빨리 웹을 잡고 풀었으면 좀 더 점수를 낼 수 있었을 텐데 아쉬웠다. 그리고 예선전은 인원 제한이 없는걸 몰랐어서 처음엔 4명 모아서 할려고 했다가 대회 시작 직전에 뒤늦게 사람 2명밖에 못 데려온 것도 좀 아쉬었다. 내년에는 소학회원들 많이 데리고 하면 좋을 거 같다.
코게에도 포렌식이나 네트워크 문제 나왔으면 좋겠다. 예전엔 그래도 한 두개씩 나왔던거 같은데..
WEB - superbee
golang으로 작성되어 있고
beego 라는 프레임워크를 사용하고 있다.
플래그는 app.conf에 정의되어 있고 (물론 주어진 파일에서는 REDEACTED)
main.go
http://[IP]/main/index 경로로 접속하면 flag를 확인할 수 있도록 되어 있지만
main.go
쿠키값을 비교하여 admin이 아니면 플래그를 확인할 수 없고, login 페이지로 redirect된다.
먼저 어드민 패스워드를 획득하여 어드민계정으로 로그인 하는 방법은
패스워드를 알아낼 방법이 없으므로 불가능하고
SSTI일까 생각해봤지만,
main.go
사용자가 입력한 값으로 render하는 곳이 없고, 애초에 beego에서는 값을 직접 때려주기 때문에 불가능하다.
어떻게 풀어야 될까 생각을 해보다가
main.go
/admin/authkey 페이지로 접근해서 encrypted_auth_key를 얻고
aes 복호화를 해서 평문 auth_key를 얻어서 sess 쿠키 값을 설정해서 main/index로 접근하여 flag를 얻는 루트같았다.
main.go
그러지 않고서야 aesencrypt함수를 넣어두고 admin페이지를 만들어둘 이유가 없다고 생각했다.
main.go
그런데 admin/authkey에 접근할려면 domain이 localhost가 되어야 한다.
아니 ssrf때릴 곳도 없는거 같은데 어떻게 domain명을 localhost로 만들지 고민을 하다가
Ctx.Input.Domain()이 사실 처음 보는 함수였기 때문에 정확히 어떻게 동작하는 지 알 필요가 있었다.
해당 이벤트 로그에는 이동식 디스크 (USB 스틱, SD카드, 외장 하드 등)과 컴퓨터 내부 디스크에 대한 정보가 저장됨.
- 이벤트 로그 필드 일부 설명
[시스템 섹션]
EventID: 항상 1006
TimeCreated [SystemTime]: 타임스탬프
EventRecordId: 로그 파일 내의 각 기록에 할당된 고유 번호
Computer: 컴퓨터 이름
Security [UserID]: 유저의 SID값. 항상 S-1-5-18임 (User SYSTEM).
[이벤트 데이터 섹션]
DiskNumber: In our analysis, we found this number varying in a range between 0-3, with 0 being assigned to the disk running the operating system (OS).
IsSystemCritical: This value is usually false, apart from when DiskNumber was 0.
BytesPerSector: Bytes per sector (usually 512-defined by the manufacturer) of the device.
Capacity: The total capacity of the device (in bytes).
Manufacter: The manufacturer of the device. Not always accurate.
Model: Model of the device. Not always accurate.
SerialNumber: Serial number of the device.
ParentId: Information about the device, including Vendor ID, Product ID, Serial Number (potential correlation with registry files).
PartitionStyle: The partition scheme of the device. MBR is 0. GPT (GUID Partition Table) is 1.
PartitionCount: Number of partitions of the device. Not to be trusted.
Mbr: Raw dump of the first 512 bytes of the Master Boot Record of the device. Contains device’s Disk Signature and Master Partition Table.
Vbr0: Raw dump of the Volume Boot Record of the device’s 1st partition. Contains the VSN of this partition.
Vbr1: Raw dump of the Volume Boot Record of the device’s 2nd partition. Contains the VSN of this partition.
Vbr2: Raw dump of the Volume Boot Record of the device’s 3rd partition. Contains the VSN of this partition.
Vbr3: In our analysis, we found that this field is not populated with the raw dump of the Volume Boot Record of the device’s 4th partition. If someone wants to determine the existence of a 4th partition, he should examine the Master Partition Table.
위에서 볼 수 있듯 한 장치의 두 번째 및 세 번째 파티션의 VSN도 저장한다. 사용자가 자신의 장치를 포맷하더라도(할당된 VSN 손실) 이벤트 로그에서 이전 VSN을 검색할 수 있다.
- 조건 및 한계점
이 연구는 Microsoft-Windows-Partition%4Diagnostic.evtx 이벤트 로그에 대한 포렌식 분석에만 중점을 둠. 레지스트리 등의 다른 아티팩트를 조사하지 않는다.
이 연구는 할당되지않음 또는 MBR 파티션이 있는 장치로 제한됨. GPT 파티션 장치는 이 이벤트 로글르 다른 방식으로 기록함. 또한 4번째 파티션이 존재할 경우 4번째 파티션에 대한 정보는 저장되지 않음.
이 연구는 FAT32, NTFS, exFAT, EXT3 파일 시스템을 사용하는 장치만을 대상으로함. 다른 파일시스템을 사용하는 장치는 이 이벤트 로그를 다른 방식으로 기록함.
해당 이벤트 로그의 수명은 짧음. 주요한 윈도우 10 업데이트될 때 이벤트 로그가 지워짐. 다만, 19041에서 19042로의 업데이트와 같이 사소한 업데이트로는 지워지지 않음.
장치유형(SSD), 연결유형 (USB <- SATA 디스크)는 이벤트 로그를 다른 방식으로 기록함.
- 방법론
VSN은 파티션의 고유하게 하는 한 가지 기능임.
VSN은 VBR 내부에 있으며, 오프셋과 길이는 파일시스템에 따라 다름.
VSN은 LNK파일 및 점프 모곩에서 대상 파일이 있는 볼륨을 가리키는데 사용됨.
MBR 파티션 테이블이 있는 장치를 식별하는 다른 기능은 디스크 서명임.
디스크 서명은 MBR의 offset 0x1b8(4byte, little endian)에 있으며 파티션이 만들어질 때 할당 됨.
--- 직접 시연을 하기 위해서 사용된 환경 및 장비가 다릅니다. ---
OS : Windows 10 home 21H2 19044.1415 usb device : A(unknown) 64GB(MBR, 4 NTFS partition), B(unknown) 8GB (MBR, 1 FAT32 partition & 1 EXT3 partiton) software : JLECmd 1.4.0.0, LECmd 1.4.0.0, AXIOM 4.7
1단계 : 이 단계에서 A 64GB USB 장치는 테스트 컴퓨터에 여러 번 연결/해제되었습니다. 장치가 연결되어 있는 동안 LNK 파일과 점프 목록을 생성하기 위해 여러 파일(4개 파티션 모두에 위치)에 액세스했습니다. 일정량의 데이터가 생성된 후 이벤트 로그, LNK 파일 및 점프 목록에 대한 포렌식 검사를 진행했습니다.
2단계 : 이 단계에서 A 64GB USB 장치의 모든 파티션을 삭제하고 3개의 새로운 NTFS 파티션을 생성했습니다. 1단계(연결/연결 해제, 모든 파티션의 파일 액세스)와 동일한 과정을 반복했습니다. 일정량의 데이터가 생성된 후 이벤트 로그, LNK 파일 및 점프 목록에 대한 포렌식 검사를 진행했습니다.
3단계 : 이 단계에서 B 8GB USB 장치는 테스트 컴퓨터에 여러 번 연결/해제되었습니다. 잠시 후 우리는 이벤트 로그에 대한 포렌식 조사를 진행했습니다.
4단계 : 이 단계에서 B 8GB USB 장치의 FAT32 파티션을 삭제하고 새로운 exFAT 파티션을 생성했습니다. 3단계(연결/연결 해제)와 동일한 과정을 반복했습니다. 잠시 후 우리는 이벤트 로그에 대한 포렌식 조사를 진행했습니다.
A usb의 환경 구성에 실패. 처음에 NTFS 파티션 4개로 나누고 각 파티션에 테스트용 파일까지 넣고 usb 재인식하니까 위 사진처럼 파티션 구성이 바뀌어서 인식됨. usb 자체 문제인지 특성인지 파악 못함.
NTFS로 정상적으로 인식되는 첫 번째 파티션은 vbr이 제대로 기록되었고, 나머지는 vbr이 0000으로 기록되었지만 이를 통해 최소 4개의 파티션이 존재했음을 알 수 있다.
2단계
3단계
USB를 연결하고 FAT32 파티션 내에 있는 테스트 파일을 열어본 이후 Microsoft-Windows-Partition%4Diagnostic.evtx 해당 이벤트 로그를 확인한 내용이다.
FAT32 파티션의 vbr은 기록되었지만 EXT3 파티션은 인식할 수 없는 포맷이므로 vbr이 기록되지 않았다.
그래도 2개의 파티션이 있는 것을 확인할 수 있다.
4단계
역시 2개의 파티션이 존재함을 알 수 있고, 두 번째 EXT3 파티션은 여전히 0000으로 기록되어있으며
첫번째 파티션이 새로 포맷되었기 때문에 vbr값이 변경된 것을 알 수 있다.
mbr값은 동일하다.
- 결론
이 게시물에서 우리는 특히 장치 속성이 필요한 경우 "Microsoft-Windows-Partition%4Diagnostic.evtx" 검사의 중요성에 대해 설명했습니다. 이 유물이 몇 년 전에 발견되었지만 우리는 아직 그 풍부한 정보를 완전히 탐색하지 못했습니다. 그럼에도 불구하고 우리는 저장되어 있는 사용 가능한 모든 VSN을 수동으로 추출하는 방법과 이 프로세스를 자동화하는 도구를 개발하는 방법을 보여주었습니다. 이 이벤트 로그에 대한 추가 연구의 여지가 있지만 독자가 이 이벤트 로그에서 찾을 수 있는 주요 아티팩트 중 일부에서 가치를 찾을 수 있기를 바랍니다.