System/FTZ

[해커스쿨]trainer10

dcho 2019. 7. 20. 15:58
SMALL

이번 시간에는 Local 해킹시 핵심이 되는 SetUID에 대하여 알아본다.

 

Local 해킹? 

해킹에는 두가지가 있다. 하나는 Remote 해킹, 이것은 자신이 해킹하고자 하는 서버에 아이디를 가지고 있지 않을 때, 아이디를 얻고자 시도하는 것을 말한다.

 

다른 하나가 Local해킹, 이것은 해킹하고자 하는 서버에 일반 계정을 가지고 있을 때, 관리자 권한(root)를 얻고자 시도하는 것을 말한다.

 

Remote 해킹 방법엔 여러가지 있는데 무작위로 아이디와 비밀번호를 입력하여 접속하는 방법에서 부터, 데몬의 취약점을 공략하여 접속하는 방법. 심지어 게시판이나 방명록을 이용하여 접속하는 방법까지. 방법은 수십가지가 넘는다고 한다.

 

하지만 우리에게 정작 중요한건, Remote 해킹이 아닌 Local 해킹이라고 한다.

 

관리자(root) 권한을 얻지 않는 한 해당 서버는 단지 그림의 떡이라면서..

 

자 그럼 도대체 평범한 계정을 가지고 있는 상태에서 어떤 방법으로 관리자 권한을 얻을 수 있을까?

 

해답은 바로 SetUID에 있다. 

우리는 이 SetUID가 걸린 파일을 조작해 관리자 권한을 얻을 수 있게 된다.

 

그럼 SetUID란 무엇인가?!

 

Set이란 말은 "변경하다" 란 뜻을 가지고 있고, UID는 User ID의 약자이다.

따라서 SetUID는 "ID를 변경한다" 라고 해석이 된다.

 

그러므로 SetUID는 일시적으로 자신의 ID를 변경하는 것을 말한다.

 

예시로 사용자가 passwd 를 이용하여 패스워드를 바꾼다. 근데 패스워드는 shadow 파일에 들어있는데 그 파일은 오직 루트만이 제어할수 있다. 그런데 사용자가 바꾼다? --> 이것은 바로 SetUID에 정답이 있다.

일반 사용자들이 그 passwd 파일을 실행하는 동안에는 "루트로의 일시적인 아이디 변경" 이 되는것이다.

결국 쉐도우 파일은 사용자의 권한이 아닌 루트의 권한으로 변경이된 셈이다.

 

정리하자면~

  1. SetUID는 파일에 걸리는구나!

  2. SetUID가 걸린 파일을 실행하면 나의 아이디가 변경되는구나!

  3. 파일의 실행이 끝나면 다시 원래의 아이디로 돌아오는구나!

 

 

그럼 SetUID가 걸린 파일은 passwd 하나 일까? 노놉! 리눅스나 유닉스에는 보통 이 SetUID가 걸린 파일이 수십개가 된다.

 

아하~ SetUID가 걸린파일을 찾아 잘 요리하면 되겠다 라는 결론이 나온다.

 

근데 실제 리눅스에 저렇게 멍청한 파일은 없지 않을까? 딱 필요한 만큼만 권리자 권한을 제공하고, 그 일이 끝나면 낼름 다시 권한을 다시 가져가 버리는게 현실 

하지만 세상엔 완벽한 것이 없다. 옥의 티처럼 그 중 멍청한 파일들이 있다고 한다. 

 

지금까지 발견된 기법인 "Race Condition", "IFS버그", "링크버그", "Buffer Overflow", "Format String Attack"등등이 바로 그것이다.

또한 이러한 버그에 의해 루트 권한을 넘겨준 파일은 "userhelper", "imwheel-solo", "restore", "screen" 등 수 없이 많다.

 

해커스쿨 로그인 메뉴에 Local Exploit이란것이 있는데 바로 그것이 지금까지 발견된 해킹 기법을 모아 놓은 것이라고 한다.

 

그럼 이 SetUID가 걸려있는지 아닌지는 어떻게 알아보지? 이제부터 그것에 대해 알려준다고한다.

 

먼저 passwd 파일에 걸린 SetUID를 확인해 본다.

  • ls -al /usr/bin/passwd

 

-r-s--x--x   1 root     root        22312 Sep 26  1999 /usr/bin/passwd*

   ↑

 

분석하면 다음과 같다. 

/usr/bin/passwd 파일은 root에게 읽기와 실행(s가 x를 포함한다)이 있고, root라는 그룹에게는 실행 권한만 있고, 위를 제외한 사용자들에게도 실행 권한만 있다.

하지만 root에게 SetUID가 걸려있기 때문에 어느 사용자이던간에 저 파일을 실행할 때는 root의 권한을 갖게된다.

 

이제 서버 전체에서 SetUID가 걸린 파일을 찾는 방법을 배워 보면

  • find / -perm -4000

 

이것을 해석하면 " / 에서 부터, 적어도 SetUID가 걸린 모든 파일을 찾아라"

 

위에서 4000앞에 붙은 -가 바로 "적어도"를 의마하며, -perm은 "권한을 찾겠다" 라는 옵션이다. 그 뒤의 '4' 자가 바로 SetUID를 의미하며, '000'은 rwx 모두를 의미한다.

 

find 명령에 대해 조금 더 자세하게 배워보면

  • -perm : 권한과 일치하는 파일을 찾는다 ex) find / -perm 4755

  • -name : 이름과 일치하는 파일을 찾는다 ex) find / -name cat

  • -user : 유저와 일치하는 파일을 찾는다 ex) find / -user mmung2

  • -group : 그룹과 일치하는 파일을 찾는다 ex) find / -group guta

 

++ PERM의 플러스(+),마이너스(-)는??

    입력하는 숫자에 해당하는 퍼미션을 완벽하게 만족하느냐? 아니면 일부만 만족해도 되느냐? 이다.

마이너스(-) 옵션으로 find 명령어를 수행하면 깐깐한 검색 

플러스(+) 옵션으로 find 명령어를 수행하면 권한중 한개라도 설정되어 있으면 검색 --> 즉 너그러운 검색

 

위의 옵션들을 서로 조합해 동시에 사용할 수 있는데

 

ex) find / -user root -perm -4000

-> 루트의 권한으로 SetUID가 걸린 파일을 찾아라!

 

이제 마무리로 해커스쿨 레벨별 해킹을 통과하는 방법을 알려준다고 한다. 

 

  1. 자신의 아이디가 level3이라고 해보자.

  2. level4로 넘어가기 위해서, level4의 권한으로 SetUID가 걸린 파일을 찾는다 ( find / -user level4 -perm -4000 )

  3. 그럼 한개 이상의 파일이 발견될 것이다.

  4. 그 파일은 임의로 작성된 "멍청한 파일" 이다.

  5. 그 파일을 이용하여 level4의 쉘을 얻으면 성공!

  6. my-pass 라고 입력하면 level4의 패스워드가..

 

 

++ 쉽게 find 하는 법 

  • 2> /dev/null

  • 숫자 2는 표준에러(STDERR)를 뜻하고, /dev/null 은 휴지통을 뜻한( 에러를 휴지통으로 쓩!)

이와 같이 명령어를 같이 이용해준다면 좋다!

 

'System > FTZ' 카테고리의 다른 글

FTZ. 2  (0) 2019.09.05
FTZ. 1  (0) 2019.09.05
[해커스쿨]trainer9  (0) 2019.07.20
[해커스쿨]trainer8  (0) 2019.07.20
[해커스쿨]trainer6  (0) 2019.07.20