일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Hacking #Baic
- C언어 # 핵심 정리
- C언어 #핵심정리
- C언어 #부록
- PHP #핵심정리
- shell_script
- Bandit
- C++ 언어 # 핵심정리
- C++ 언어 # 핵심 정리
- C언어 # 부록
- HTML #핵심정리
- MySQL #핵심정리
- C++ 언어 #핵심정리
- Today
- Total
cCcode
Bandit 원정대 2주차 미션 본문
Level 7 ~ Level 8
Level Goal
[The password for the next level is stored in the file data.txt next to the word millionth]
비밀번호는 data.txt 파일 안 [millionth]라는 단어 뒤에 저장되어있다네요.
아.. 직접 찾아보려 했는데 무리입니다. 그래서 저는 'grep 명령어'를 통해 [millionth]라는 글자를 걸러 내보겠습니다.
아무것도 나오지 않습니다. 왜냐하면 'cat 명령어'와 'grep 명령어'가 개별적으로 실행되서 그런거 같습니다. 그럼 |(파이프)를 통해 두 명령어를 연결하겠습니다.
Level 8 ~ Level 9
[The password for the next level is stored in the file data.txt and is the only line of text that occurs only once]
비밀번호는 data.txt 파일 안 한 번에 한 줄만 발생된 즉, 유일하게 중복되지 않은 라인에 위치해있다고 합니다.
이번에는 'uniq 명령어'를 통해서 중복되는 내용의 라인들을 삭제해보겠습니다.
이 경우에는 -u 를 옵션으로 사용해 중복 라인이 없는 것만 확인하겠습니다.
이상하게 분명히 중복 라인을 필터링 했을텐데 달라진게 없네요....아,, 찾아보니 'uniq 명령어'가 전체적으로 분산된 중복은 찾아내지 못한다고 하네요. 그러니까 [1 2 2 1] 에서 '2'처럼 서로 연속되는 중복라인은 거르되 '1'처럼 연속하지 않은(한 줄 이상 동 떨어져있는) 중복라인의 경우는 제거하지 못한다는 의미인거 같습니다.
그럼 'sort 명령어'를 통해 파일의 내용을 정렬한 후 다시 필터링 해보겠습니다. 여기서 'sort 명령어'를 사용하는 이유는 현재 파일에 산발적으로 퍼져있는 중복라인을 한데 모으기 위함입니다.
Level 9 ~ Level 10
[The password for the next level is stored in the file data.txt in one of the few human-readable strings, preceded by several ‘=’ characters.]
이 비밀번호 역시 data.txt 파일 속에 존재하며 사람이 읽을 수 있는 문자열 중 하나로 여러 개의 '=' 문자가 앞에 위치해있다고 합니다.
문제에선 비밀번호가 사람이 읽을 수 있다고 했으니, 아마 아스키 코드로 작성되지 않을까 싶네요. 다만 글자들 자체가 깨져서 이 상태로는 아무것도 할 수 없습니다. 그래서 'strings 명령어'로 읽을 수 있는 문자열만 출력해보겠습니다.
그런데 이 비밀번호로 접근하는 과정에도 많은 아스키코드들이 동시에 출력되기에 비밀번호가 한 눈에 들어오지 않습니다. 그래서 저는 '=' 을 앞에 두고 있는 아스키코드들만 따로 필터링 해보겠습니다.
Level 10 ~ Level 11
[The password for the next level is stored in the file data.txt, which contains base64 encoded data]
data.txt 파일 안에 내용이 base64로 인코딩 되어 있다고 하네요.
인코딩(암호화) 되어있다 라고 문제에서 명시되어 있으니 디코딩(복호화) 해주면 되겠네요.
Level 11 ~ Level 12
[The password for the next level is stored in the file data.txt, where all lowercase (a-z) and uppercase (A-Z) letters have been rotated by 13 positions]
data.txt 파일에 저장된 비밀번호는 모든 소문자(a~z), 대문자(A~Z)가 13 자리씩 회전되었다고 하네요.
음.. 듣다보니 카이사르 암호와 굉장히 흡사하다는 생각이 드네요.
카이사르 암호는 보내고자 하는 메세지를 n번 씩 밀려써서 암호화하는 방법입니다.
사실 복화화 코드 만들기가 살짝 귀찮아서 인터넷에 있는 코드들을 참고하려고 했는데 다들 너무 설명이 부족한 감이 없지 않아 있어서 제가 따로 만들었습니다.
#include <stdio.h>
int main()
{
char Content[] = { "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh\0" }; // 암호화 된 내용
int i = 0;
int temp_tool = 0;
while (1)
{
if (Content[i] == '\0') break; // NULL 문자 나올 때까지 반복
if (Content[i] >= 97 && Content[i] <= 122) // 내용의 유형 파악 (소, 대문자 또는 공백 또는 숫자)
{
if ((Content[i] + 13) > 122) // 아스키 코드의 범위를 벗어났을 경우
{
temp_tool = (Content[i] + 13) - 122;
temp_tool -= 1;
printf("%c", 'a' + temp_tool);
// x(120) + 13 (133) = k(107)
}
else // 아닐 경우
printf("%c", Content[i] + 13);
}
else if (Content[i] >= 65 && Content[i] <= 90)
{
if ((Content[i] + 13) > 90) // 범위가 벗어난 경우
{
temp_tool = (Content[i] + 13) - 90;
temp_tool -= 1;
printf("%c", 'A' + temp_tool);
}
else // 아닌 경우
printf("%c", Content[i] + 13);
}
else if (Content[i] >= 0 && Content[i] <= 10)
printf("%d", Content[i]);
else
printf("%c", Content[i]);
i += 1; // 인덱스 증가
}
// 아스키 코드 (소, 대문자 범위)
// a(97) ~ z(122)
// A(65) ~ Z(90)
return 0;
}
사실 이렇게 프로그램을 통해서 알아내는 방법 외에도 'tr명령어'를 이용해 비밀번호를 알아낼 수 있습니다.
지정한 문자를 바꾸거나 삭제할 때 'tr 명령어'를 사용합니다.
Level 12 ~ Level 13
[The password for the next level is stored in the file data.txt, which is a hexdump of a file that has been repeatedly compressed. For this level it may be useful to create a directory under /tmp in which you can work using mkdir. For example: mkdir /tmp/myname123. Then copy the datafile using cp, and rename it using mv (read the manpages!)]
file.txt 파일 안 반복적으로 압축된 16진수 덤프 파일에 저장된다고 합니다. 이 레벨에서는 tmp 아래 디렉토리를 생성한 후 cp 를 이용해 데이터 파일을 복사하고 mv 를 이용해 이름을 바꾸는 게 유용하다고 합니다. 그전 문제보다는 확실히 어렵기 때문에 그런가 문제가 친절하네요.
이제 tmp에 디렉토리를 만들고 data.txt 파일을 보내고 그 디렉토리로 이동해보겠습니다.
그리고 'xxd -r 명령어'를 사용해 바이너리 파일로 만들어주겠습니다.
'ls 명령어'로 확인해보면
파일이 실제로 생성된 것을 확인하실 수 있습니다.
'file 명령어'를 통해 해당 파일의 정보를 보면
gzip 형태로 압축되어있네요. 근데.. 확장자가...... 어.. 네 gzip 은 확장자가 .gz 이기에 'mv 명령어'로 바꿔주겠습니다.
이제 압축을 풀어볼까요..?
...
Level 13 ~ Level 14
[The password for the next level is stored in /etc/bandit_pass/bandit14 and can only be read by user bandit14. For this level, you don’t get the next password, but you get a private SSH key that can be used to log into the next level. Note: localhost is a hostname that refers to the machine you are working on]
비밀번호는 /etc/bandit_pass/bandit14에 저장되며 사용자 bandit14만 읽을 수 있다고 합니다. 이 레벨의 경우 다음 비밀번호를.. 얻지.. 못한다..?? 아 비공개 SSH 키를 받는다고 하네요.
기본 디렉토리에는 개인용 ssh 키가 있네요.
그럼 이제 'ssh 명령어'에 -i(공개 키 인증을 위한 ID(개인키)가 읽히는 파일 선택) 를 옵션으로 줘서 RSA로부터 인증을 받겠습니다.
그 후 해당 주소로 접근한다면 성공입니다.
지식 정리
Grep 명령어
파일 안에서 특정 문자열을 찾아 걸러주는 명령어입니다.
sort 명령어
텍스트로 된 파일의 행단위 정렬을 할 때 사용하는 명령어입니다.
uniq 명령어
중복되는 행을 삭제시키는 명령어입니다.
strings 명령어
실행 파일에서 아스키코드를 찾아 출력해주는 명령어입니다.
tr 명령어
지정한 문자열을 치환하거나 삭제해주는 명령어입니다.
tar 명령어
한 개 이상의 파일들을 하나로 묶거나 풀 때 사용하는 명령어입니다. (앞에 -xvf 를 사용하며 gz 압축을 풀 때 사용합니다.)
gzip 명령어
tar과 동일한 역할을 수행하되, 앞에 -d 가 옵션으로 사용됩니다.
bzip 명령어
이 역시 압축을 풀 때 사용되며, 옵션으로는 -d 가 사용됩니다. (다만, 압축을 푸는 대상이 bz2 입니다.)
Base64?
base64는 바이너리를 텍스트로 인코딩 하는 방법 중 하나로 명령어로서의 base64는 base64의 인코딩과 디코딩을 도와줍니다.
리눅스에서 PIPE는?
파이프는 재지향을 할 경우 사용되며 간단히 말하자면 리눅스 쉘에서 사용하는 명령어들을 조합하거나 연결할 때 사용됩니다. 또한 순서를 중요시하죠. 예를 들어보자면 아까 전 Level 7 ~ Level 8 문제의 텍스트 파일을 열고 millionth 라는 단어를 필터링 하던 명령어의 순서를 아래와 같이 바꾸면 어떻게 될까요?
확실한 건 저희가 원하는 결과가 나오지 않는 다는 점입니다. 이처럼 PIPE에서는 명령어의 나열 순서 또한 중요합니다.
아,, 그리고 리눅스 쉘에서 사용 가능한 파이프의 개수에는 제한이 없습니다. 그러니 많은 명령어들의 조합으로 다양한 수행할 수 있다는 장점이 존재합니다.
인 코딩 / 디 코딩?
문자를 기준으로 코드로 변환하는 것을 인 코딩 / 코드를 기준으로 문자로 변환하는 것을 디 코딩이라고 합니다. 다른 말로는 암호화와 복호화라고 하기도 해요.
아스키 코드?
아스키는 7bit 바이너리를 인간이 읽을 수 있는 문자열로 만든 표준 부호로 총 128개 입니다.
비밀번호 없이 SSH 로그인?
일단 ssh key를 생성하면 비공개 키(로컬 머신에 위치함)와 공개 키(리모트 머신에 위치함)로 나누어져 생성됩니다. ssh 로그인을 시도한다면 클라이언트가 비공개 키와 공개 키의 동일 여부를 판단해 로그인 되는 방식입니다. 이 뿐만 아니라 RSA 암호화 방식을 이용해 ssh key를 만들기도 하며, 이렇게 생성된 키를 가지고 있다면 비밀번호 없이도 ssh로 접근할 수 있습니다.
+ 바이너리(binary)란?
바이너리는 기본적으로는 두 부분을 의미하며, 다음과 같은 의미로 사용됩니다.
1) 0과 1, 두 숫자로만 이루어진 진법 즉, 이진법
2) 컴퓨터에 이진법의 형태로 저장된 파일(이진 파일)
3) 텍스트 형태가 아닌 이진 형태로 인코딩 된 파일
4) 프로그램 배포에서 소스코드가 아닌 실행파일
'Linux' 카테고리의 다른 글
[Linux]Shell script Basic - 1 (0) | 2021.07.14 |
---|---|
Bandit 원정대 3주차 미션 (0) | 2021.07.10 |
Bandit 원정대 1주차 미션 (0) | 2021.06.25 |