Linux의 shadow 파일을 간단하게 보겠습니다.

 


 shadow 파일을 보면, 유저 이름과 이상하게 긴 문자열이 있거나 !이나 *가 있는 것을 볼 수 있습니다. 그리고 뭔가 이상한 구분자가 상당히 많이 있다는 것도 볼 수 있습니다. 이 중 앞에 2개는 유저 이름과, 패스워드가 encrypted가 된 것을 의미합니다. 물론 $으로 구분된 무언가는 또 다른 뜻이 있지만, 이것은 밑에서 후술해 보도록 하겠습니다.

 

 

 2번째 단락의 encrypted password를 보시면, 2번째 필드의 의미를 대략 짐작하실 수 있을 겁니다.

 

 

 그러면, 먼저 cho1을 하나 추가해 보겠습니다. 그 다음에, shadow 파일에 어떤 내용이 들어갔는지 보겠습니다.

 

 

 앞에 떡하니 !가 쳐져 있습니다. 이게 무엇인지 모르겠으니, 일단 지워 보겠습니다.

 

 이 내용을 그대로 저장한 다음에 빠져 나와서, cho로 로그인 된 상태에서, cho1로 바꿔 보겠습니다.

 

 

 어라? 패스워드 없이, 뭔가 바뀌었다는 것을 알 수 있습니다. whoami를 쳐 보겠습니다.

 

 

 현재 cho1로 뭔가를 하고 있습니다. 중요한 것은 2번째 필드가 비어있을 때, 아무런 인증 없이, cho1이라는 유저로 접근할 수 있었다는 것입니다. 이제, cho로 switch 해 보겠습니다.

 

 

 패스워드가 필요하군요. cho의 비밀번호를 입력하면 다시, cho 유저가 쓰는 oh my zsh 쉘로 돌아왔음을 알 수 있습니다.

 


 이제 처음에 설정된 대로 앞에 !을 붙여보겠습니다. 그리고 똑같은 방법으로 하면, 아까와는 다르게 password를 입력하라고 뜬다는 것을 알 수 있습니다. 예를 들어 su mysql을 입력해 보겠습니다.

 

 

 그러면, 암호를 입력하는 것이 뜨는데. 이상하게 아무렇게나 입력하면 Auth failure가 뜹니다.

 

 

 이는 다음 단락에서 보면 알 수 있는데요. !나 *가 들어가면, unix password를 쓸 수 없다고만 언급이 되어 있습니다. 단지, 다른 방식으로 로그인을 할 수 있다는 내용이 언급되어 있습니다.

 

 

 passwd 명령의 -S 옵션을 이용해서 mysql, tss하고 cho, root를 뽑아보면 2번째 인자가 다르다는 것을 알 수 있는데요. cho는 password를 가지고 접근할 수 있습니다.

 

 

 man 페이지를 보면, -S 옵션을 주면, status information을 출력한다고 되어 있습니다. 여기서, 2번째 field가 중요한데요. Locked가 되어 있는지, Password가 없는지, 아니면 Password 사용 가능한지에 대해서 나옵니다. mysql이나 tss의 2번째 필드는 L이였으므로, Lock이 된 상태입니다.

 

 이에 대해서 추가로 문서를 보겠습니다.

 

 

 password가 disable이 되었다. Note를 보면, account를 disable 한 게 아니다. 라는 문구가 있는데요. SSH key와 같은 다른 방식으로 로그인이 가능하다는 언급을 하고 있습니다. 여기까지 보면 되겠군요. 그러면 암호화된 문자열은 대체 무엇을 의미할까요?

 

 


 $로 구분된 것을 보면, 처음에 6이 나오고, 그 다음에 짧은 것이 나오고, 그 다음에 매우 긴 문자열이 나옵니다.

 

 

 긴 문자열의 길이를 세어보니, 110-25+1 = 86자입니다. 뭔가 매우 강력한 hash 함수를 쓴다는 추정만 할 수 있는데요. 링크를 보시면 답이 나와 있습니다. 앞에 6은, 알고리즘의 종류인 SHA512를 의미합니다. 그 다음은 salt 문자열, 그 다음에는 그것들을 반영해서 암호화한 string이라고 되어 있습니다.

 

 SHA512 같은 해시 함수들은, 입력값이 조금만 달라져도, 결과값이 많이 달라지는데, 기존 암호에 salt까지 추가를 하면, 해시값으로부터 암호를 추론하기 좀 더 까다로울 겁니다. 거기에 스트래치까지 하면 정말 너무 셀 겁니다. 일단 여기에서 얻어갈 것은, 2번째 필드가 $num$salt$string 형식으로 나올 수도 있다는 것이고, 그런 경우에는 어떤 해시함수를 쓸 건지와 salt 값, 그리고 암호화된 (혹은 hash 함수에 의해서 계산된) string이 나온다 정도만 이해하시면 좋을 듯 싶습니다.