시스템 해킹 04주차

준필·2022년 2월 9일
0

시스템 해킹

목록 보기
4/4
post-thumbnail

Linux에서의 권한 구조

이 글에 사용되는 모든 예시는 macOS를 기준으로 한다.

터미널에서 ~/code/example.c의 파일 구조를 ls -l 명령어를 통해 본 모습이다.

앞에서부터 순서대로

[파일 유형] [파일 권한] [파일의 링크 개수] [파일의 소유자] 
[파일의 소유자의 그룹] [파일의 크기] [최종 수정 시각] [파일명]

을 나타낸다.

  • Linux에서는 파일에 대한 접근권한과 파일 종류를 나타내기 위해 총 16bit를 사용한다.
    • 9bit는 해당 파일에 대한 소유자(user), 그룹 소유자(group), 기타 사용자(other)의 접근 권한을 나타낸다.
    • 4bit는 해당 파일의 종류를 나타낸다.
    • 3bit는 해당 파일에 대한 특수 권한을 나타낸다.

파일 유형

일반 파일(-) / 디렉토리(d) / 링크 파일(l) / 블록 디바이스 파일(b) / 문자 디바이스 파일(c)

파일 권한(Permision)

  • 9bit중 3bit씩 각각 소유자, 그룹 소유자, 기타 사용자의 파일에 대한 읽기(read), 쓰기(write), 실행(excute) 권한을 명시한다.
    rwx 순서대로 3bit에 할당되며 따라서 모든 사용자에 대해 읽기와 쓰기가 가능한 파일은 110110110 즉 666(6=4+2+0)으로 표현된다.
  • 나머지 3bit는 해당 파일에 대한 특수 권한을 나타내며 각각 setuid, setgid, sticky비트이다.

터미널에서 chmod 명령어를 통해 파일의 권한을 변경할 수 있다.

setuid(4xxx 또는 u+s)

  • 해당 파일 또는 명령에 대해서 소유자의 권한을 부여하는 비트이다.

    대/소문자 s는 각각 파일에 대한 사용자의 실행 권한이 없을/있을 경우를 나타낸다.

setgid(2xxx 또는 g+s)

  • 해당 파일 또는 명령에 대해서 그룹 소유자의 권한을 부여하는 비트이다.

    대/소문자 s는 각각 파일에 대한 그룹 사용자의 실행 권한이 없을/있을 경우를 나타낸다.

setuid, setgid가 설정된 파일을 실행하면 각각 소유자, 그룹 소유자의 권한을 부여하는 것이다. 실행할 수 없을 때는 권한이 부여되지 않는다.

sticky(1xxx 또는 o+s)

  • 파일에서는 무시되며 디렉토리에 적용되면 모든 사용자가 해당 디렉토리에 파일을 자유롭게 생성할 수 있게 해주는 비트이다.

    대/소문자 t는 각각 파일에 대한 기타 사용자의 실행 권한이 없을/있을 경우를 나타낸다.


UID(User Identification)

  • 여러 명의 사용자가 동시에 사용하는 시스템에서 사용자를 식별하기 위해 사용되는 식별자이다.

root 사용자의 uid는 0이다.


쉘코드(Shellcode)

  • 시스템의 특정 명령을 실행하는 작은 사이즈의 프로그램이다.

    공격자가 소프트웨어의 취약점을 뚫기 위해 사용된다.

종류

로컬 쉘코드(Local Shellcode)

  • 공격자가 대상 시스템에 대한 접근 권한을 가지고 있는 경우, 버퍼 오버플로 등의 취약점이 있는 높은 권한을 가진 프로세스를 공격하여, 해당 프로세스와 같은 높은 권한을 획득하기 위해 사용된다.

원격 쉘코드(Remote Shellcode)

  • 공격자가 네트워크상의 다른 대상 시스템에 존재하는 취약점이 있는 프로세스를 공격하고자 하는 경우 사용한다. 공격자가 대상 시스템의 쉘에 접근할 때 일반적으로 TCP/IP 소켓 연결을 사용한다.

원격 쉘코드의 종류

리버스 쉘코드(Reverse Shellcode) : 목표 시스템이 공격자에게 연결을 하게 만든다.
바인드 쉘코드(Bind Shellcode) : 목표 시스템의 특정 포트를 바인드(?)해 공격자가 대상 시스템에 연결할 수 있도록 한다.
다운로드&실행 쉘코드(Download & Execute Shellcode) : 쉘을 직접 실행하지 않고, 외부로부터 악성코드를 다운로드하고 실행한다.


ssh(Secure Shell)

  • 네트워크 상의 다른 시스템에 접속하기 위해 사용되는 암호화를 사용하는 인터넷 프로토콜이다.

이 글에서는 wargame을 하기 위해 사용된다.


pwnable.kr - fd

  • linux comand, ssh 등 여러가지 지식을 이용해 ctf 문항을 풀어보자!

필자가 wargame을 진행한 곳은 pwnable.kr이다.


글을 읽어보니 linux의 file descriptor에 대한 내용인 거 같고 답은 아마도 flag를 통해 알 수 있을 것 같다.
문제를 풀기 위해 터미널에서 ssh를 사용해 문제에서 알려준 시스템에 접속해보자.

ssh연결을 한 후 비밀번호를 입력하면 이런 화면이 뜨게 된다.

현재 디렉토리에 뭐가 있는지 그리고 접근 권한은 어떻게 되는지 확인하기 위해 ls -l 명렁어를 사용했더니 fd, fd.c, flag라는 파일이 있다.

답을 찾기 위해 flag파일을 읽으려 했으나 접근 권한이 없어 실패했다. 또한 fd 파일을 실행해보니 "pass argv[1] a number", "learn about Linux file IO"라는 문자열이 출력된다.


fd.c을 cat를 통해 읽어보니 fd는 이 코드를 컴파일한 것 같다. 그럼 임의의 파일 디스크립터를 통해 buf 변수에 "LETMEWIN"이라는 문자열을 저장하면 우리가 원하는 flag의 값이 출력될 것이다.


fd.c에서 16진수 0x1234의 값은 10진수로 4660이었다.


그럼 fd를 실행하며 첫 번째 인자로 4660을 넘겨주면 해당 파일 디스크립터는 0번째 파일 디스크립터 즉 stdin을 의미할 것이다. stdin에 LETMEWIN을 입력해 해당 문제를 해결했다!

해결된 문제는 이렇게 초록색 띠가 생긴다😃

profile
공부할 게 너무 많잖아?

0개의 댓글