학사 나부랭이
Hacker School - level4 본문
여기서 잠깐! 백도어란?
뒷문, 즉 ID나 패스워드를 사용해서 사용권한을 획득하는 기능을 무허가로 이용하기 위해 시스템 내에 몰래 설치된 통신접속의 기능을 말해요. 여기서는 누군가 level5의 계정을 탈취해 거기에 백도어를 설치했다... 정도로 이해하면 될 것 같아요.
일단 백도어가 있다는 곳으로 가보죠!
읽을 수만 있는 백도어 파일이 있네요. 여기서 의아해할 수 있는게 백도어라서 SetUID가 안 걸려있어요. 몰래 설치한 거니까요! 일단 한 번 읽어보면...
ⓐ 서비스의 이름이에요. finger가 실행되면 이 백도어도 실행된다는 의미예요.
ⓑ xinetd의 제어를 받을 것인가를 결정해요. yes는 제어를 받지 않고 no는 제어를 받아요.
여기서 xinetd(eXtended InterNET Daemon)는 오픈소스 슈퍼 서버 데몬으로 인터넷 기반 연결을 관리해요.
또 여기서 데몬은 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스이며 사용자의 요청을 기다리다가 요청이 발생하면 적절히 대응하는, 그러니까 메모리에 상주하다 요청이 오면 즉시 대응하도록 대기 중인 프로세스예요. 빈번히 사용되는 데몬이 standalone 방식으로 실행되고 자주 사용되지 않으면 super daemon 방식으로 실행되요.
ⓒ 서비스 포트가 사용 중인 경우 해당 포트의 재사용 허가의 여부를 뜻해요.
ⓓ 사용하는 소켓 종류예요.
소켓은 두 프로그램이 네트워크를 통해 통신할 수 있도록 소프트웨어로 작성된 통신 접속점(接続点)이에요. 두 소켓이 연결되면 다른 프로세스끼리 원격에 있든 로컬에 있든 데이터를 전달할 수 있어요.
stream 스트림 소켓은 양방향으로 바이트 스트림을 전송할 수 있는 연결 지향형 소켓이에요. 양쪽 응용 프로그램이 모두 데이터를 주고받을 수 있어요. 오류 수정, 전송 처리, 흐름 제어 등을 보장하며 전송 순서에 따른 중복되지 않은 데이터를 수신해요. 각 메시지를 보내는데 별도의 연결을 맺으므로 약간의 오버헤드가 존재하니까 소량보다는 대량으로 보내는 경우에 사용하는 것이 좋아요. 이러한 이유로 TCP 프로토콜을 사용하죠.
dgram 데이터그램 소켓은 명시적으로 연결을 맺지 않아 비연결형 소켓이라고도 해요. 메시지를 대상 소켓에게 전송된 후 대상 소켓은 메시지를 적절히 수신해요. 스트림 소켓을 사용하는 게 신뢰성이 높지만 연결을 수립하는데 드는 오버헤드를 무시할 수 없어요. 클라이언트에서 서버로 데이터를 전송할 때 UDP를 사용하고요. 그런 만큼 메시지의 확실한 전달을 보장하지 않으며 데이터를 중간에 잃어버려도 오류를 되돌리지 않아요.
ⓔ xinetd가 요청되어있는 동안 데몬이 끝날 때까지 다른 요청을 받을 것인가를 결정해요. yes는 다른 요청을 받지 않고 no는 다른 요청에 대해 데몬이 동작해요.
ⓕ 데몬의 UID예요.
ⓖ 서비스가 실행될 때 불러올 프로그램의 위치와 이름이에요.
ⓗ 로그인에 실패할 때 USERID가 로그에 남아요.
요약하자면 finger이라는 명령어를 사용하면 level5 권한으로 /home/level4/tmp/backdoor 파일을 xinetd 데몬이 실행한다는 뜻이에요.
일단 finger가 뭐하는 친구인지 실행해볼까요?
핑거는 외부 유저가 내부 유저의 로그인 이름이나 마지막 로그인 시간 같은 사용자의 정보를...
이렇게 조회할 수 있게 해주는 프로토콜이래요. 인터넷에 알아보니까 passwd 파일에서 읽어서 보여준대요. 여기서 finger파일의 기능을 바꿔서 passwd 대신 다른 파일 또는 명령을 하도록 바꿔야 하나 알아보며 삽질했네요...ㅠㅠ
그럼 이 경로로 이동해볼까요?
finger.swp는 제가 이미 풀었기 때문에 생긴 파일이고요. backdoor이라는 파일이 없네요? 그럼 만들면 되죠! 여기서 backdoor 프로그램을 짜는데 방식이 나눠지더라고요. 저는 c파일을 만드는 방식을 했어요.
이전에 본 코드와 비슷하죠? system()에 있는 문장을 셸에서 실행해주는 거예요.
여기서 xinetd.d 데몬은 인터넷으로 요청이 들어왔을 때 응대를 해주기에 그냥 finger만 하면 내부에 있는 /usr/bin/finger가 응답해요. 그러나
@localhost, @127.0.0.1 (자기 자신을 가리켜요)
@192.168.233.129, /sbin/ifconfig (ftz의 ip를 가리켜요. 79번 포트를 열었을 경우에 실행 가능해요!)
를 입력하면 네트워크로 finger를 요청한 게 되기에 xinetd 데몬이 실행되어 서비스에 등록된 finger가 호출된답니다.
두 번째, 셸 스크립트로 푸는 방법!
셸 스크립트가 뭐냐 하면 셸을 사용해서 프로그래밍을 할 수 있는 거예요. 기본 명령어를 기반으로 하여 몇 가지 문법이 추가되는 형태로 일반적인 프로그래밍 언어와 비교해서 간단하고 쉽게 응용이 가능해요.
먼저 #!/bin/bash를 첫 줄에 넣어 인터프리터를 지정해주고 아래에 명령어를 넣어요.
인터프리터는 컴파일러와는 다르게 코드를 한 줄씩 읽어가며 실행하는 프로그램이에요. 김철수 교수님이 예전에 코드를 한 줄 한 줄 읽어 처리한다 뭐 그런 말씀 하신 게 기억나네요.
그리고 권한을 보면 xinetd 데몬이 실행하고 싶어도 권한이 없네요. 권한을 부여해보죠.
실행 권한도 부여했겠다 이제 위의 finger 명령어를 넣으면 해결돼요!
마지막으로 한 방법이 더 있는데 포트번호를 알아내서 finger 명령어를 내리는 대신 포트로 접근하는 방법이 있어요.
tcp 프로토콜 중 포트가 열린 서비스를 출력하는 명령어인데요 여기서 finger가 어떤 포트를 사용하는지는...
잡으면 나와요. 그래서 이 포트로 접속하면 xinetd 데몬이 실행되어 암호를 바로 알 수 있는데 저는 포트를 열지 않았고 이미 풀어버려서 메모리 덤핑이 되어 다시 먹히질 않더라고요ㅠㅠ
'Dot-Gabi > Hacker School Prob.' 카테고리의 다른 글
Hacker School - level6 (0) | 2021.03.25 |
---|---|
Hacker School - level5 (0) | 2021.03.25 |
Hacker School - level3 (0) | 2021.03.23 |
Hacker School - level2 (0) | 2021.03.21 |
Hacker School - level1 (0) | 2021.03.21 |