바인드쉘, 리버스쉘

2013. 10. 24. 18:18 from Security

바인드쉘은 피해자의 서버에서 포트를 열어놓고 공격자가 접속하는것이고..

리버스쉘은 공격자의 서버에서 포트를 열어놓고 피해자의 서버에서 공격자 서버로 접속하도록 유도하는것이다


그냥 햇갈려서ㅁㄴㅇ

'Security' 카테고리의 다른 글

Native API를 이용한 static 안티 디버깅 정리  (1) 2013.11.10
안티디버깅 간단 정리  (1) 2013.10.30
TLS에 관한 간단한 탐구  (0) 2013.10.21
허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
Posted by xer0s :

TLS에 관한 간단한 탐구

2013. 10. 21. 23:26 from Security

TLS는 Thread Local Storage의 약자로 스레드별로 연관 데이터를 기록하기 위해 사용될수 있다.

예를 들어 스레드의 생성 시간을 저장할 수 있도록 각 스레드별로 공간을 마련하여 스레드가 종료될 때 이 값을 이용하여 스레드의 수행 시간을 계산할 수 있다.


TLS도 Dynamic TLS와 Static TLS로 나뉘는데 이들 각각은 애플리케이션과 DLL에서 사용할 수 있다.

Static TLS는 사실상 다룰 내용이 많이 없기 때문에 이번 포스팅에선 Dynamic TLS에 관해서 다뤄볼려한다.


애플리케이션에서 Dynamic TLS의 장점을 활용하려면 네 개의 함수를 이용해야되는데 실제로 이런 함수들은 

DLL 개발시 자주 사용되기도 한다. 아래 그림은 마이크로소프트가 TLS를 관리하기 위해 내부적으로 사용하는

자료 구조의 모습이다.



위 그림은 시스템에서 수행 중인 단일 프로세스에 포함되어 있는 사용 중인 플래그들의 집합을 보여준다.

각각의 플래그는 FREE 상태나 INUSE 상태가 될 수 있으며 이 플래그들은 각각의 TLS 슬롯이 사용 중인지의

여부를 나타낸다. 


Dynamic TLS를 사용하려면 가장 먼저 TlsAlloc 함수를 호출해야 하는데 이 함수는 프로세스 내의 비트 플래그 배열로부터 FREE플래그의 위치를 찾아내어 해당 플래그 값을 INUSE 상태로 변경하고 비트 플래그 배열에서의 인덱스를 반환한다. 


스레드가 생성되면 시스템은 해당 스레드와 연계되는 TLS_MINIMUM_AVAILABLE 개수의 PVOID형 배열을 할당하고 0으로 초기화 한다. 스레드 별로 존재하는 PVOID 배열에 값을 저장하기 전에 이 배열의 어느 요소가 사용 가능한지를 알아야 하는데 이를 위해 TlsAlloc 함수를 호출 했다.


스레드 배열 내에 값을 할당하기 위해서는 TlsSetValue 함수를 호출하면 된다.


BOOL TlsSetValue(

DWORD dwTlsIndex,

PVOID pvTlsValue);


이 함수는 스레드가 가지고 있는 배열에서 dwTlsIndex 매개변수 값을 인덱스로 하는 공간에 pvTlsValue 매개변수로 전달하는 값을 할당한다. 스레드는 이렇게 TlsSetValue 함수를 호출하여 자신이 소유하고 있는 배열의 값을 변경할 수 있지만 다른 스레드에 있는 배열의 값은 변경하지 못한다.


스레드 배열로부터 값을 얻어오기 위해서는 TlsGetValue 함수를 호출하면 된다.


PVOID TlsGetValue(DWORD dwTlsIndex);


이 함수는 스레드가 소유하고 있는 TLS 슬롯으로부터 dwTlsIndex번째 값을 가져온다. TlsSetValue 함수와 마찬가지로 TlsGetValue 함수를 호출하는 스레드는 자신이 소유하고 있는 배열에서만 값을 가져올 수 있다.


프로세스 내의 모든 스레드에서 앞서 예약하였던 TLS  슬롯을 더이상 사용할 필요가 없는 시점이 되면 TlsFree 함수를 호출하면 된다.


BOOL TlsFree(DWORD dwTlsIndex);


아래는 스레드는 40바이트 크기의 구조체를 가리키는 포인터를 함수를 최초로 호출할때 전달한다고 가정하고 이런 종류의 함수는 이 함수가 다시 호출될 때 앞서 전달된 구조체를 다시 사용할 수 있도록 그 값을 저장하도록 하는 코드이다.



DWORD g_dwTlsIndex; // TlsAlloc 함수의 반환 값으로 가정


...


void MyFunction(PSOMESTRUCT pSomeStruct)

{

if (pSomeStruct != NULL)

{


if (TlsGetValue(g_dwTlsIndex) == NULL)

{

TlsSetValue(g_dwTlsIndex, HeapAlloc(GetProcessHeap(), 0, sizeof(*pSomeStruct));

}


memcpy(TlsGetValue(g_dwTlsIndex), pSomeStruct, sizeof(*pSomeStruct));


}


else

{

pSomeStruct = (PSOMESTRUCT) TlsGetValue(g_dwTlsIndex);


...


}

} 



# Reference


제프리 리쳐의 Windows via c/c++ 

http://debugjung.tistory.com/45

http://studyfoss.egloos.com/5259841







'Security' 카테고리의 다른 글

안티디버깅 간단 정리  (1) 2013.10.30
바인드쉘, 리버스쉘  (0) 2013.10.24
허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
Posted by xer0s :

허..

2013. 10. 17. 23:23 from Security

패킹/언패킹은 감이 잘안와서 문서들좀 읽어보고 리버싱케알 푸는데..

너무 허무함....

허무..

ImagePrc도 알것 같은데 제대로 분석좀 해봐야겠다



'Security' 카테고리의 다른 글

바인드쉘, 리버스쉘  (0) 2013.10.24
TLS에 관한 간단한 탐구  (0) 2013.10.21
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
Posted by xer0s :

php extract vulnerability

2013. 10. 13. 17:20 from Security

php는 GET과 POST같은 Request 값을 받아 변수화 시켜주는 extract함수가 존재하는데

이 함수의 역할은 배열속의 키값들을 변수화 시키는 것이다.


예를들어 만약 배열 h속에 키값이 a, b 가 들어 있다고 가정하면


$h[a] = 1;

$h[b] = 2;

echo $h[a];

echo $h[b];


해줬을시 1, 2가 출력이 되는데

여기서 extract()를 사용하면


$h[a] = 1;

$h[b] = 2;

extract($h);

echo $a;

echo $b; 


이렇게 해줘도 1, 2가 출력이 되는것이다.


extract 함수는 보안적으로 문제가 있는 함수인데 바로 이 함수의 특성을 이용해 서버 변수 환경변수등을 포함해 이미 정의되 있는 변수를 덮어버릴수 있는것이다.

함수 자체의 옵션으로 이런 overwrite을 방지해주는 옵션이 있지만 default로 설정되있지 않으므로 보안 중요성을 모르는 개발자들이 이 함수를 썼다가 치명적 결함을 일으킬수도 있는것이다.


아래 코드를 봐보자.


session_start();

if(!isset($_SESSION['admin']))

{

$_SESSION['admin'] = false;

}

extract($_POST);


위 코드에서 php에서 미리 선언되 있는 $_SESSION array를 덮어버릴수 있는데

admin세션과 captcha등을 사용할 경우 captcha 세션도 덮어버릴수 있다.


예를들어 12345와 같은 임의의 captcha를 전송 했을때 아래와 같이 우회가 가능하다.



이렇게 captcha를 우회할수 있을 뿐더러 captcha를 정확히 입력해준뒤 아래와 같이 admin을 우회할수도 있다.




extract()이 취약하기 위한 몇가지의 조건이 있는데


1. 변수가 선언된뒤 extract()함수가 이용이 되어야 한다.

2. extract()로 인해 덮여진 변수가 다시 다른 값으로 뎦여진다면 취약하지 않다.

3. 공격자가 내부변수이름을 알아야 한다.

4. EXTR_SKIP이 옵션으로 선언되었을 경우 extract()함수는 취약하지 않다.


이렇게 4가지 정도가 있다.






'Security' 카테고리의 다른 글

TLS에 관한 간단한 탐구  (0) 2013.10.21
허..  (0) 2013.10.17
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
유용한 자료들..  (0) 2013.04.22
Posted by xer0s :

몇일 전에 알아낸 사실인데

RTL을 하거나 ROP등을 하기 위해 exit함수 또는 가젯등을 이용할때 그게 어떤 원리로 돌아가는지 궁금해서 

연구해봤는데

RTL을 예로 들어보면 스택구조가 [ buffer ][ sfp ][ ret ] 대충이런식으로 있다고 가정했을때

ret에 system함수 주소를 넣어주면 정상적으로 (call로 호출) system함수를 호출 했을때 함수 호출 이후 

코드 실행을 위해 saved eip를 스택에 푸쉬하는데 ret로 함수를 호출하면 이 push eip가 안된 상태에서 

함수 내부에서 함수를 빠져나올때 원래 push eip가 되있어야 될위치의 값을 호출하기 때문에 

[ &system ][ &exit ][ /bin/sh ] 와 같은 구성이 가능한 것이다. 함수 인자를 ebp + 8부터 참조하는것도

이 이유 때문이다.

이런 원리를 이용해 chaining rtl을 할때도 pop pop ret과 같은 가젯을 이용해 계속 ret로 함수를 호출하면서

구성을 해줄수가 있다.

'Security' 카테고리의 다른 글

허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
유용한 자료들..  (0) 2013.04.22
Duelist crackme #1 풀이  (0) 2013.03.10
Posted by xer0s :

[Ollydbg 1.x] OllyMSDN plugin

2013. 7. 11. 00:28 from Security

리버싱 공부중 우연히 좋은 플러그인을 하나 발견했습니다.

이때까지 모르는 api는 그때그때 msdn에다 직접 검색하면서 공부하였는데 

이 플러그인은 바로 그런 번거로움을 없애주고 직접 msdn사이트에서 찾고자 하는 api를 찾아줍니다


 

OllyMSDN.zip




dll을 풀어도 안되는 경우가 있는데 win32.hlp도 함께 넣어줘야 합니다.

win32.hlp는 진짜 파일이 아니여도 되고 이름만 win32.hlp면 됩니다


플러그인 사용법은 자신이 검색하고자 하는 api에 오른쪽 마우스 클릭후 

Help on symbolic name(CTRL + F1) 을 클릭해주시면 됩니다.



'Security' 카테고리의 다른 글

허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
유용한 자료들..  (0) 2013.04.22
Duelist crackme #1 풀이  (0) 2013.03.10
Posted by xer0s :

유용한 자료들..

2013. 4. 22. 23:59 from Security

최근들어 시험기간에다가 여러 바쁜 일들이 겹쳐서 포스팅을 못했습니다..

SQLI 감을 잃지 않으려고 자료들을 뒤져보면서 읽던 도중에 괜찮은 자료를 발견해서 공유합니다.


http://packetstormsecurity.org/files/view/105600/beyond-sqli.txt

http://websec.ca/kb/sql_injection


sqli2.pdf


시험 후에 포스팅 한번 하겠습니다.

감사합니다. 


'Security' 카테고리의 다른 글

허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
Duelist crackme #1 풀이  (0) 2013.03.10
Posted by xer0s :

Duelist crackme #1 풀이

2013. 3. 10. 19:59 from Security

리버싱 연습도 할겸 크랙미를 풀고 있습니다.

많은 크랙미들중에서도 이 Duelist crakme series는 초보자들에게 매우 도움이 될꺼 같은 크랙미더군요.

아래는 크랙미 파일 원본입니다.


압축을 풀고 exe파일이라서 먼저 실행을시켜 봤습니다.

특정 코드의 입력을 요구하고 있고 안봐도 아시겠지만 코드의 값이 틀리면 다시 시도하라는 메세지박스가 뜹니다.


본격적인 분석을 위해 OllyDbg로 크랙미를 열어보았습니다.

처음 열었을때 나타나느 코드들입니다.

스크롤바를 내리면서 쭉 코드들을 봐봤을때 다음과 같은 API를 확인할수 있었습니다.

저는 처음 리버싱을 배울때는 API들을 하나하나 다 알아가면서 크랙미를 풀 필요가 있다고 생각하기 때문에 우선 이 API를 알아

봤습니다. 

WM_GETTEXT 메시지를 컨트롤로 보내 컨트롤의 텍스트를 읽어 lpString 버퍼에 채워준다. 이때 컨트롤은 버튼, 에디트, 스태틱 등의 텍스트 표현이 가능한 컨트롤이어야 한다. 만약 버퍼 길이(nMaxCount)보다 문자열이 더 길면 문자열은 잘려진다.

GetDlgltemText A 에 대한 설명중 일부분입니다.

이 설명대로라면 버퍼의 크기는 0x24이고 버퍼의 시작주소는 004020f7입니다.

실제로 004020f7에 있는 값들을 봐보면 저희가 입력햇던 값이 저장이 되는군요


GetDlgltemText A 이후부터는 본격적인 연산이 시작되는 코드입니다.

입력한 값을 가지고 연산을 하는 부분인데 연산에 관한 설명은 다 아시리라 믿고 생략하겠습니다.

위의 연산들을 다 수행하고 eax랑 0이랑 같을때 jnz short due-cm1, 0040114C 명령을 수행하게 되는데 

아래가 0040114c에 있는 코드들입니다.

00401158의 call 명령을 수행하기전에 3개의 인자를 전해주는것 같은데 004020f7이 버퍼의 주소라는 걸 눈치챌수 있었습니다.

0040114e의 값이 뭔지 알아보기위해 call 함수를 따라 들어가봤습니다.

이 부분을 유심히 바라보다가 call명령어가 끝나는부분을 봐봤었습니다.

이 코드에서 eax를 0과 다르게 해줘야 된다는걸 알수 있었는데 eax가 최근에 변한곳을 찾아보니 004011d8이였습니다.

이 부분을 건너뛸수 있는 방법이 004011d3에서 문자열을 비교할때 틀리지 않고 비교를 마친다면 jcxz 명령어때문에 1인 eax를 0

으로 바꿔줄 필요 없이 바로 함수의 종착점으로 가는것입니다.

004011d3 명령어의 비교대상이 edi와 esi이고 edi는 arg1 esi는 arg2이므로 최종적으로는 004020f7의 데이터와 004020d3의 데이

터를 비교해줫을때 같게 해주면 되는것입니다. 

이에 맞게 코딩을 해주면

#include <stdio.h>

#include <stdlib.h>


int main(void)

{


    int i;

    int a[35] = {0x7B, 0x61, 0x65, 0x78, 0x64, 0x6D, 0x26, 0x6B, 0x7A, 0x69, 0x6B, 0x63, 0x65, 0x6D, 0x26, 0x3C, 0x26,

    0x66, 0x6D, 0x7F, 0x6A, 0x61, 0x6D, 0x7B, 0x26, 0x6A, 0x71, 0x26, 0x6C, 0x7D, 0x6D, 0x64, 0x61, 0x7B, 0x7c};

    int b[35];

    

    printf("##########################\n");

    printf("#  Duelist crackme #1    #\n");

    printf("#              by xer0s  #\n");

    printf("##########################\n\n\n");

    printf("The Key is : ");


    for (i=0; i<35; i++)

    {

        b[i] = a[i] ^ 0x43;

        b[i] = b[i] ^ 0x1E;

        b[i] = b[i] ^ 0x55;

        printf("%c", b[i]);

    }

    system("pause");

    return 0;

}


The Key is : simple.crackme.4.newbies.by.duelist

코딩 잘못해서 한참 해멧엇네요..

풀어서 기분은 좋군요 ㅎ


'Security' 카테고리의 다른 글

허..  (0) 2013.10.17
php extract vulnerability  (0) 2013.10.13
RTL시 pop pop ret, exit 함수 호출의 원리  (2) 2013.09.26
[Ollydbg 1.x] OllyMSDN plugin  (0) 2013.07.11
유용한 자료들..  (0) 2013.04.22
Posted by xer0s :