SetUID 란?

보안/시스템 보안 2018. 3. 21. 21:22

SetUID 는 파일이 실행되는 동안에 해당 파일 소유자의 권한을 획득하는 것을 의미한다. 만약 소유자가

root라고 가정을 하면 root의 권한을 가진 일반 사용자가 해킹에 이용을 할 수 있단 소리다. 

SetUID를 이용해서 백도어를 만들 수 있고, 백도어가 있는 곳을 내 마음대로 오갈 수 있는 통로가 된다.



* 특수권한 (SetUID, SetGID, Sticky Bit)

http://brothernsister.tistory.com/32


SetUID를 기본적으로 테스팅을 해보면 아래의 간단한 프로그래밍으로 테스트를 해본다.

SetUID를 사용학 위해선 unistd.h, sys/types.h 헤더파일이 필요하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
 
int main(int argc, char **argv)
{
    if(argc != 2)
    {
        printf("Usage: %s [user id]\n",argv[0]);
        printf("*** user id is number ***\n");
        return 1;
    }
 
    printf("real user id:%d effective user id:%d\n",getuid(), geteuid());
    uid_t uid=atoi(argv[1]);
    setuid(uid);
    printf("real user id:%d effective user id:%d\n",getuid(), geteuid());
 
    return 0;
}
cs



컴파일을 하고 터미널 창에 아래의 명령어를 입력해준다.

$ whoami
$ grep 사용자ID /etc/passwd

터미널을 이용해서 간단한 명령어를 입력하면 아래의 화면이 출력이 된다. 




/etc/passwd


            root:x:0:0:root:/root:/bin/bash

              ①  ②③④    ⑤    ⑥     ⑦          


① 필드 1 : 사용자명

② 필드 2 : 패스워드(/etc/shadow 파일에 암호화되어 있음)

③ 필드 3 : 사용자 계정 uid

④ 필드 4 : 사용자 계정 gid

⑤ 필드 5 : 사용자 계정 이름(정보)

⑥ 필드 6 : 사용자 계정 홈 디렉토리

⑦ 필드 7 : 사용자 계정 로그인 쉘


그리고 지금 로그인한 계정 말고, 다른 계정을 만들거나 다른 계정의 정보도 위의 명령어를 이용해서 /etc/passwd 정보를 확인한다.

위의 컴파일한 프로그램을 권한을 준다.


$ chomod u+s es_setuid(프로그램명)


그리고 다른 계정으로 로그인을 한다.

$ su test

$ ./ex_setuid 1001

위의 명령을 입력하면 프로그램의 원 작성자의 uid가 셋팅되어있다. 


그리고 밑에는 위의 프로그램을 리버싱을 한 것이다. 이건 다음 시간에...ㅎㅎㅎ









'보안 > 시스템 보안' 카테고리의 다른 글

[FTZ] 해커스쿨 Level5  (0) 2018.03.30
[FTZ] 해커스쿨 Level4  (0) 2018.03.28
[FTZ] 해커스쿨 Level3  (0) 2018.03.27
[FTZ] 해커스쿨 level2  (0) 2018.03.26
시스템 보안 개론  (0) 2018.02.06

설정

트랙백

댓글

[리버싱 기초] 반복문 - while문

보안/리버싱 2018. 3. 14. 08:25


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main(void){
    int val = 0;
 
    while(1){
        scanf("%d"&val);
 
        if(val == 10)
            break;
 
        val++;
    }
    return 0;
}
cs








'보안 > 리버싱' 카테고리의 다른 글

[리버싱] Lena Reverse Engineering Newbie #1  (0) 2018.05.22
GDB 명령어  (0) 2018.03.18
[리버싱 기초] 반복문  (0) 2018.03.12
[리버싱 기초] 조건문  (0) 2018.03.08
[리버싱 기초] 어셈블리어 기초문법과 레지스터  (0) 2018.03.07

설정

트랙백

댓글

[리버싱 기초] 반복문

보안/리버싱 2018. 3. 12. 19:28
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
void main(void){
    int val=2, i;
 
    for(i=1; i<10; i++){
        printf("2 * %d = %d\n", i, i*val);
    }
}
cs






포문 어셈블리어로 정리한 파일

반복문_포문_리버싱.pdf



'보안 > 리버싱' 카테고리의 다른 글

GDB 명령어  (0) 2018.03.18
[리버싱 기초] 반복문 - while문  (0) 2018.03.14
[리버싱 기초] 조건문  (0) 2018.03.08
[리버싱 기초] 어셈블리어 기초문법과 레지스터  (0) 2018.03.07
[리버싱 기초] 입력문  (0) 2018.03.07

설정

트랙백

댓글

[리버싱 기초] 조건문

보안/리버싱 2018. 3. 8. 20:27

간단한 조건문

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
void main(void){
    int val = 0;
 
    if(val == 0){
        printf("%d\n");
    }
}
cs






조건문 밑에 조건문이 있을 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
void main(void){
    int val = 0;
 
    if(val == 0){
        printf("%d\n");
    }
 
    if(val != 0){
        printf("val is not 0!\n");
    }
}
cs



설정

트랙백

댓글

[리버싱 기초] 어셈블리어 기초문법과 레지스터

보안/리버싱 2018. 3. 7. 23:41

어셈블리어 입문자를 위한 어셈블리어 자료들의 모음 [bOBaNa].pdf


출처는 pdf 파일 안에 있습니다. 

'보안 > 리버싱' 카테고리의 다른 글

[리버싱 기초] 반복문  (0) 2018.03.12
[리버싱 기초] 조건문  (0) 2018.03.08
[리버싱 기초] 입력문  (0) 2018.03.07
[리버싱 기초] 변수타입  (0) 2018.03.06
[리버싱 기초] 변수 선언  (6) 2018.03.02

설정

트랙백

댓글

[리버싱 기초] 입력문

보안/리버싱 2018. 3. 7. 22:20



변수 선언후 scanf()함수를 이용해서 값을 입력받고, pirntf() 함수를 이용해서 출력


1
2
3
4
5
6
7
8
#include <stdio.h>
 
void main(void){
    int val;
    
    scanf("%d"&val);
    printf("%d\n", val);
}
cs






변수 선언 후 scanf()함수를 이용한 부분 리버싱






설정

트랙백

댓글

[리버싱 기초] 변수 선언

보안/리버싱 2018. 3. 2. 23:51

리눅스를 이용해서 리버싱을 공부하고 있습니다. 리눅스는 우분트 16버전을 사용하고 있습니다.

디스어셈블링은 기존에 설치되어있는 gdb 프로그램을 이용해서 하고 있습니다. ^^


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
void main(void){
    int val;
 
    val = 2;
 
    printf("val의 값은 : %d\n", val);
}
cs





main의 시작은 400526 주소에서 시작되는 명령어 문에서 main에서 시작을 한다. push %rbp 에서 시작을 한다.

왜 그렇냐고 하면 스택 프레임 자체가 프로그램이 사용될 때 마다 생성되서 사용되기 때문에 Stack Frame 을 사용하려면

주소지를 알아야 사용할 수 있기 때문에 처음 시작은 첫 행에서 사용된 명령어가 사용된다.


그리고 2번째까지도 mov %rsp, %rbp 선언된건 저렇게 약속이 되어 있기 때문에 대다수가 저렇게 선언이 된다. 프로그램이 생성이 되서

가지고 온 스택 프레임의 첫번째 주소지를 %rsp 레지스터 값을 넣어준다.(%rbp는 값이 변하면 안 된다. 변할 시에 스택 프레임의 시작

주소를 알 수 없게 되어버리기 때문에 %rbp는 고정되고, %rbp에 담긴 스택 프레임의 주소를 %rsp에 넣고, 변수가 선언이 되고, 스택에 내용이

저장이 되면 rsp의 값이 변경이 된다.)



세번째 행에서 보면 sub 0x10, $rsp 어셈블러가 있다. 이 행은 변수를 선언하는 부분인데, c 프로그래밍을 하면 변수마다 각각의 이름을

선언할 수 있지만 어셈블러는 따로 변수명을 선언하지는 않는다. 그리고 0x10 부분은 16진수다. 0x10를 $rsp 레지스터에 빼면 빈 공간이

생기는데, 빈 공간이 변수가 선언되어서 사용되는 공간이다.




1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void main(void){
    int val, val2;
 
    val = 10;
    vla2 = 1;
 
    int val3 = 0;
    
    val3 = val;
}
cs





변수 선언을 한 다른 경우를 보게 되면 첫 행과 두번째 행은 똑같다. 




두번째 내용을 정리한 패드로 정리한 내용이다.






설정

트랙백

댓글

[기초] 메시지 후킹(Message Hooking)

보안/리버싱 2018. 1. 17. 22:04


메시지후킹(Message Hooking)

: 영어로 Hook는 갈고리, 낚시 바늘 정도의 뜻을 지닌다.  원하는 것을 낚아챌 때 낚시 바늘을 사용한다. 

메시지 후킹은 컴퓨터의 어떤 것을 낚아채기 위해서 사용되는데, 과연 어떤 것을 낚아채는 걸까?


 

후킹이란 다른 프로세스에 걸려서(Hooked) 해당 프로세스의 정보를 얻어 오거나, 변경하는 것이 가능한 기술이다.

프로세스란 윈도우의 프로세스라고 생각하면 되겠다.


어떤 건물의 전화를 도청을 하고 싶다. 그러면 건물의 전화선들이 지나가는 곳에 도청 장치(후킹 프로시저)를 설치한다. 

그럼 도정장치의 전화 내용들이(windown Message) 지나간다. 도청 장치는 그 중 필요한 메시지를 저장하고 있거나, 필요한 곳으로 전송한다.



후킹 함수를 만들기 위해서는 지켜야 하는 규칙

1. Call Back 함수여야함

2. 함수의 마지막 부분에서는 CallNextHookEx() 함수를 호출함

3. 함수가 받는 인자는 정해져 있음

4. 후킹 프로시저는 DLL 안에 있어야함


LRESULT CALLBACK KeyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)

{

             if( nCode >= 0 )

             {

             

             }

             // We must pass the all messages on to CallNextHookEx.

           return ::CallNextHookEx( g_Hook , nCode , wParam , lParam );

}


1. Win32 Dynamic Link Library 프로젝트 생성

2. Cpp 파일 위의 후킹함수를 만들어줌




후킹 프로시저를 시작하는 함수, 종료하는 함수


후킹 프로시저를 시작하는 함수

HHOOK SetWindowsHookEx(

    int idHook,

    HOOKPROC lpfn,

    HINSTANCE hMod,

    DWORD dwThreadId

);

MSDN : https://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx



후킹 프로시저를 종료하는 함수

UnhookWindowsHookEx() 의 사용법

 

BOOL UnhookWindowsHookEx(          

             HHOOK hhk

);


MSDN : https://msdn.microsoft.com/en-us/library/ms644993(v=vs.85).aspx



'보안 > 리버싱' 카테고리의 다른 글

[리버싱 기초] Hello World !!  (0) 2018.02.28
Lena 리버싱 - 튜토리얼 1강 pdf 파일  (0) 2018.02.12
DLL 이젝션(프로그램)  (0) 2018.01.15
코드엔진 level19  (0) 2017.09.12
코드엔진 level18  (0) 2017.09.11

설정

트랙백

댓글