나만의 리눅스 18일째.

ignore_all을 0에서 1로 바꿨을 때 신호(ping)를 보내도 머신에서 응답이 오지 않는다.브로드캐스트를 찾아도 응답이 오지 않습니다.브로드캐스팅(broadcasting)은 송신 호스트가 전송한 데이터가 네트워크에 연결된 모든 호스트에게 전송되는 방식을 의미한다.’sysctl-a | grepixmp_echo*’를 입력하면 ixmp_echo*에 대한 정보가 나타난다.”net.ipv4.icmp_echo_ignore_all” 값이 0임을 확인할 수 있다.

‘핑-c3 192.168.100.128’ BT를 머신을 이용해 CentOS 머신에 핑을 세 번 보냈다.핀이 잘 가는 것을 확인할 수 있다. -c옵션을 주고 숫자를 넣으면 정해진 숫자만큼 핀이 가게 된다.

「sysctl-wnet.ipv4.icmp_echo_ignore_all=1」に変えた.

1로 바꿔줘서 핀이 잘 되는지 확인해 보기 위해 BT에서 CentOS 머신으로 핀을 다시 보내봤다.핀의 잘리지 않는 것을 확인할 수 있다.이것은 broadcast는 가지만 reply가 오지 않기 때문에 CentOS 머신이 살아 있는지 죽었는지 확인할 방법이 없다.BT로 ping을 보낸 머신은 “arp-a”를 입력하면 머신의 MAC 주소도 알 수 있다.

“nano buffer.c”를 입력하여 buffer.c라는 이름으로 위와 같이 설정한 후 소스 파일을 저장해 주었다.

“ls”를 입력하면 buffer.c라는 파일이 있고 “gcc buffer.c-obuffer”를 입력하면 컴파일이 되고 buffer라는 실행 파일이 생긴다.

“./buffer”를 입력하고 buffer를 실행하면 32bit 정도의 차이가 있음을 알 수 있다.paul을 입력하면 아무런 변화가 없다. 여기서 32bit(한 글자에 1bit)를 초과하면 사용할 수 있는 메모리를 침범하기 때문에 인식이 되지 않는다.

다시 한 뒤 32bit을 맞추어”cat/etc/passwd”를 입력하면 명령어를 함께 처리했다.이것은 동적 메모리 할당 또는 메모리 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용하는 메모리 공간을 할당을 한다.사용이 끝나면 운영 체제가 사용할 수 있도록 반납하고 다음에 요구가 오면 재할당을 받을 수 있다.그러나 32bit을 사용한 뒤”cat/etc/passwd”를 입력했을 때에 할당된 메모리를 모두 사용하므로 실행되지 않으면 정상이지만 시행됐다.BOF(Buffer Overflow)는 메모리의 동작 과정 중의 장애에 의한 잘못된 동작을 유도하는 취약성입니다.프로세스가 데이터를 버퍼에 저장할 때 입력 값의 크기를 검증하지 않는 경우 주어진 버퍼를 넘어선, 즉 지정된 위치 이외의 장소에 보존되어 인접하는 메모리를 덮어 씁니다.인접 메모리에는 기존의 데이터가 보존되어 있으며, 변수, 프로세스 흐름 제어 등의 데이터가 포함됩니다.그러므로, 메모리 액세스 에러에 따른 이상 동작을 수행하며, 결과적으로 취약점으로 동작하게 됩니다.앞으로 이 BOF에 대해서 천천히 알아보려구요.우선 BOF을 알려면 메모리, 레지스터 등의 구조 및 개념과 앞으로 사용되는 gdb의 사용법 등 본격적인 출범에 앞서서 필요한 배경 지식을 살펴보고 싶습니다메모리 구조

다시 실행한 후 32bit를 맞추어 “cat/etc/passwd”를 입력하였더니 명령어를 함께 처리해 주었다.이는 동적 메모리 할당 또는 메모리 동적 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다. 사용이 끝나면 운영체제를 사용할 수 있도록 반납하고 다음에 요구가 오면 재할당을 받을 수 있다. 그러나 32bit를 사용한 후 “cat/etc/passwd”를 입력했을 때 할당된 메모리를 모두 사용하므로 실행되지 않으면 정상이지만 실행되었다.BOF(Buffer Overflow)란 메모리의 동작 과정 중 오류로 인한 잘못된 동작을 유도하는 취약점입니다. 프로세스가 데이터를 버퍼에 저장할 때 입력값의 크기를 검증하지 않을 경우 주어진 버퍼를 초과한, 즉 지정된 위치 이외의 장소에 저장되어 인접한 메모리를 덮어씁니다. 인접 메모리에는 기존 데이터가 저장되어 있으며 변수, 프로세스 흐름 제어 등의 데이터가 포함됩니다. 따라서 메모리 액세스 에러에 의한 이상 동작을 수행하여 결과적으로 취약점으로 동작하게 됩니다.이제부터 이 BOF에 대해 천천히 알아보려고 합니다. 우선 BOF를 알기 위해서는 메모리, 레지스터 등의 구조 및 개념과 앞으로 사용될 gdb 사용법 등 본격적인 시작에 앞서 필요한 배경지식에 대해 알아보도록 하겠습니다.메모리 구조Stack의 동작은 상기와 같습니다.16byte의 Stack공간에 A(4byte)데이터를 보존할 때 PUSH를 통해서 저장합니다.쳐들어간다는 것입니다.이때 ESP-4, 즉 스택 포인터의 값을 합한 값에서-4값을 저장하겠습니다.왜요?Stack은 메모리의 높은 주소 값에서 낮은 주소 값으로 이동하는 것으로 16byte에서 4byte씩 줄이는 것입니다.높은 곳에서 낮은 곳에.다음에 B데이터를 보존할 때 마찬가지로 PUSH를 통해서 A데이터 위에 밀어넣게 됩니다.ESP치도 4의 값을 저장합니다.C데이터까지 같은 방식으로 데이터를 저장합니다.그런데 다시 한번 A데이터를 뽑고 싶다면?먼저 말한 Stack의 동작 방식인 후 입선 출신으로 C데이터를 POP을 통해서 제치고 ESP의 값은-4에서는 없어. 4의 값을 저장합니다.이어 B데이터를 뽑은 뒤 A데이터를 선택할 수 있습니다.이것이 Stack의 동작 방식인 후 입선 출입니다.정리하면 Stack은 메모리의 높은 주소 값에서 낮은 주소 값에 데이터가 저장되고 작동 방식은 후 입선 출 방식으로 동작합니다.버퍼 오버 플로 공격 프로그램의 결함을 이용하여 실행 중인 프로세스를 빼앗아 악성 코드를 실행하거나 시스템을 강제 종료시키거나 권한 상승을 통해서 관리자 껍질을 얻기하는 버퍼(프로그램이 실행될 때에 일시적으로 사용하는 메모리 영역)오ー바ー후로ー을 막아야 한다.일반적으로 프로그램은 버퍼 메모리에 확보된 자신의 메모리 영역(메모리 주소)에서 실행되므로 이 영역을 뛰어넘는 데이터를 보존할 수 없다.그러나 버그나 악성 코드 등에서 이 저장 공간 영역을 넘는 데이터를 넣으면 오버하는 용량만 옆의 메모리 영역에 접어들게 되며, 옆의 메모리에 들어간 데이터가 실행되거나 외부에 내용이 나타나게 된다.이런 공격이 버퍼 오버 플로이다.예전과 달리 최근 프로그램에서는 이러한 버퍼 오버 플로 공격이 어렵지만 C나 C++로 작성된 프로그램은 자유롭게 메모리 영역에 출입할 수 있으므로 위험하기 때문에 C/C++로 작성된 프로그램을 보면 주의를 기울여야 한다.<=최근에는 동적 메모리 할당(malloc:memory allocation)을 이용하기 때문에 오히려 더 버퍼 오버 플로 공격이 쉽게 되기도 한다.=>그러므로 malloc()strcpy(), wcscpy()strcat(), getwd()scanf()등 안전 아니라 함수를 검사하는 알고리즘(LibSafe)가 시스템에 들어 있어야 한다.물론 gcc-c++ 같은 컴파일러를 일반 사용자에게 쓰게 해도 안 되는 것을 상대로 알아봤다.BT가 hunt라는 프로그램을 실행한 뒤 Session hijacking를 하려고 한다.hunt라고 하는 도구가 있지만 Man in the Middle식 공격이다.MitM에는 중간에 낀 해커 머신이 A에는 B님, B에는 A님께 행동해야 하고, 도중에 ippacket forward를 해야 한다.그리고 해커 머신은 오가는 모든 패킷을 보기 위해서 NIC를 Promisc(uous)mode에 해야 한다.두 노드의 세션을 만들기 위해서 Telnet등으로 연결되어 있어야 한다.telnet을 이용하여 CentOS 머신과 Metasploitable을 접속하였다.그 후, 무엇이든 입력해 보았다.BT에서 CentOS머신과 Metasploitable기계의 내용을 볼 수 있다.Session hijacking은 유저와 컴퓨터, 또는 2대의 컴퓨터 간 활성화된 상태를 말한다.세션·하이쟈쯔킹는 시스템 간의 접속이 활성화된 상태, 즉 로그인(Login) 된 상태를 가로채는 일을 의미한다.TCP세션 하이 재킹은 TCP의 고유의 취약성을 이용하고 정상적인 접속을 뺏는 방법이다.서버와 클라이언트 통신 시에 TCP의 시퀀스 번호를 제어하는데 발생하는 문제를 공격한다.TCP는 클라이언트와 서버 간 통신을 할 때, 패킷의 연속성을 보증하기 위해서 각각 시퀀스 번호를 사용한다.이 시퀀스 번호가 틀렸다고 이를 바로잡기 위한 작업을 하지만 TCP세션의 납치는 서버와 클라이언트에 각각 틀린 시퀀스 번호를 위조하고 연결된 세션에 잠시 혼란을 준 뒤 자신이 끼어들어 가는 방식이다.트러스트를 이용한 세션은 물론 텔넷, FTP등 TCP를 이용한 거의 모든 세션의 위협이 가능하며 인증 문제 해결을 위한 일회용 비밀 번호, 토큰 기반 인증을 이용한 세션도 위협이 가능하다.2. 정상적인 세션 통과 절차 TCP세션 하이 재킹 공격 방법을 알려면 TCP쓰리 웨이 핸드 쉐이크에서 정상적인 TCP시퀀스 번호의 교환과 Established상태에 대해서 알 필요가 있다.우선 다음의 표를 잘 기억한다.명칭 설명 Client_My_Seq 클라이언트가 관리하는 자신의 시퀀스 넘버 Client_Server_Seq 클라이언트가 알고 있는 서버의 시퀀스 넘버 Server_My_Seq 서버가 관리하는 자신의 시퀀스 넘버Server_Cient_Seq 서버가 알고 있는 클라이언트의 시퀀스 넘버Data_Len 데이터 길이시퀀스 넘버에 의한 TCP 접속 상태는 동기화와 비동기화의 두 가지이다. 정상적인 접속의 경우 시퀀스 넘버는 동기화 상태에 있고 클라이언트가 가지고 있는 시퀀스 넘버를 서버가, 서버가 가지고 있는 시퀀스 넘버를 클라이언트가 정확히 알고 서로 일치한다.정상 TCP 세션의 성립 과정① 접속하기 전에 클라이언트 포트는 Closed상태로 서버는 서비스를 제공하기를 기다리고 있으므로 Listen상태이다.② 클라이언트는 32비트 숫자 중 임의의 숫자(Client_My_Seq)을 생성하고 서버에 Syn패킷을 보낸다.서버는 클라이언트가 보낸 Client_My_Seq치를 읽고 Server_Client_Seq치로 저장한다.이때 클라이언트는 Syn_Sent의 상태가 된다.③ 서버는 Server_My_Seq의 값을 생성하고 Server_Client_Seq에 패킷의 길이만 보태고 클라이언트에 보낸다.여기서 데이터는 0이므로 단순히+1이라고만 표시한다.서버는 Syn_Received상태가 되고 클라이언트는 Server_Client_Seq+1을 받고 자신의 Client_My_Seq비교하고 일치하면 Server_My_Seq치를 Client_Seq치로 저장한다.④ 클라이언트는 Client_Server_Seq+1을 서버에 보낸다, Established상태가 된다.서버도 클라이언트가 보낸 Client_Server_Seq+1과 자신의 Server_My_Seq과 비교하고 일치하면 Established상태가 된다.이처럼 정상적인 동기화 상태가 되면 다음과 같은 상태이다.Client_My_Seq=Server_Client_SeqServer_My_Seq=Client_Server_SeqTCP세션 하이 재킹은 상기의 상태를 무너뜨리는 일부터 시작된다.3. 서버와 클라이언트의 비동기화 상태 ● 데이터가 전송될 때까지 안정적(stable)인 상태이다.Client_My_Seq≠ Server_Client_SeqServer_My_Seq≠ Client_Server_Seq● 데이터가 송신될 때는 다음과 같은 상태의 데이터가 향후 사용 때문에 보존되지만 클라이언트 서버 승인 번호는 전달되지 않는다.Server_Client_Seq<Client_My_SeqClient_My_Seq<Server_Client_Seq+Data_Len● 패킷 수신이 불가능한 상태이며, 데이터도 버릴 수 있다.Server_Client_Seq+Data_Len<Client_My_Seq Client_My_Seq<Server_Client_Seq4. 세션 하이 재킹 공격 ● 비동기화의 작성 방법-서버에서 초기 설정 단계의 접속을 끊고 다른 시퀀스 넘버로 새 연결을 생성한다.- 많은 널 데이터를 보낸다.● 새 연결을 생성하고 비동기화하는 방법 TCP를 이용한 세션은 클라이언트 IP주소/포토 번호, 서버의 IP주소/포트 번호로 구성된다.공격자는 생성한 패킷의 클라이언트 IP주소와 포트 번호를 위조한 뒤 서버와 클라이언트가 각각 알고 있는 시퀀스 번호를 조작하고 속인 뒤 다음과 같은 상황을 만든다.-클라이언트 측 Client_My_Seq=공격자가 생성한 Server_Client_SeqClient_Server_Seq=공격자가 생성한 Server_My_Seq-서버 측 Server=공격자가 생성한 Client_Server_Seq=공격자가 생성한 Client_My_SeqTCP 세션 하이재킹 공격 시 TCP 세션 변경 프로세스① 클라이언트는 서버와 모두 연결된 Established상태인 공격자는 적절한 시퀀스 번호를 획득하기 위해서 스니핑을 하고 있다.② 공격자는 공격 시점에서 비동기화 상태 중 세션이 완전히 끊기지 않는 시퀀스 번호의 범위에서 RST패킷을 생성하고 서버에 보낸다.서버는 잠시 Closed상태가 되는데, 클라이언트는 그대로 Established상태이다.③ 공격자는 A_Client_My_Seq를 생성하고 서버에 보낸다.④ 서버는 새로운 A_Client_My_Seq를 받아들이고 Server_My_Seq를 다시 생성해서 공격자에게 보낸 뒤 Syn_Received상태가 된다.⑤ 공격자는 정상 연결처럼 서버와 시퀀스 번호를 교환하고 공격자와 서버 함께 Established상태가 된다.원래의 클라이언트는 여전히 Established상태로 서버의 네트워크 상태가 한동안 접속 문제로 받아들여지고 접속은 나갔는데 인증 세션은 열린 상태이다.⑥ 공격자는 공격 전에 클라이언트가 서버와 통신을 하던 시퀀스 번호를 모두 아는 상태이므로 클라이언트와 정상적인 통신을 하고 서버는 공격자가 새로 생성한 시퀀스 번호를 가지고 통신을 한다.공격자가 서버와의 접속을 끊고 다시 접속을 시도하는 동안 클라이언트는 정상적인 패킷을 서버에 송신한다.그러나 서버는 정상이 아니라 시퀀스 넘버로 인식하고 ACK패킷에 서버_My_Seq와 서버_Client_Seq를 들여보내다.이 작업은 시퀀스 번호를 맞추기 위한 작업이다.그러나 클라이언트도 서버가 송신한 Server_Client_Seq가 자신의 Client_My_Seq과 다르다는 것을 확인하고 서버에 Client_My_Seq와 Client_Server_Seq이 든 ACK패킷을 송신한다.이런 과정이 무한히 반복되는 경우가 있으며 이를 “ACK Strom”으로 알려졌다.

error: Content is protected !!