320x100

 

 

 

Telnet과 SSH의 주요 차이점 중 하나는 네트워크 통신의 암호화 지원 여부입니다.

  • Telnet: 암호화를 지원하지 않습니다. 데이터가 평문으로 전송되기 때문에 보안에 취약합니다.
  • SSH (Secure Shell): 암호화를 지원합니다. 데이터가 암호화되어 전송되므로 보안성이 높습니다.

 

HTTP와 HTTPS의 차이점은 주로 네트워크 통신의 암호화 지원 여부에 있습니다.

  • HTTP (HyperText Transfer Protocol): 암호화를 지원하지 않습니다. 데이터가 평문으로 전송되어 보안에 취약합니다.
  • HTTPS (HyperText Transfer Protocol Secure): 암호화를 지원합니다. SSL/TLS 프로토콜을 사용하여 데이터가 암호화되어 전송되므로 보안성이 높습니다.

 

사전 실습환경 구축

  • VirtualBOX
  • PickPick
  • Putty
  • Notepad++

 

취약점 진단 vs 모의해킹 차이점

기준이 있고 없고의 차이

취약점 진단

  • 기준: 일반적으로 자동화된 도구나 스캐너를 사용하여 알려진 취약점을 식별합니다. OWASP Top Ten과 같은 표준화된 기준을 따릅니다.
  • 목적: 시스템의 취약점을 목록화하고, 이들 취약점의 심각성을 평가하여 보안 상태를 개선하는 데 초점을 맞춥니다.

모의 해킹

  • 기준: 해커의 시각에서 시스템을 공격하는 방식으로 진행됩니다. 특정 기준 없이 실제 공격 기술을 사용하여 취약점을 발견합니다.
  • 목적: 실제 공격자가 시스템에 침투하는 과정을 시뮬레이션하여 보안 방어의 효과성을 평가하고, 취약점을 실질적으로 악용할 수 있는지 확인합니다.

결론적으로, 취약점 진단은 기준에 따라 알려진 취약점을 찾는 반면, 모의 해킹은 기준 없이 실제 공격을 시뮬레이션하여 보안 상태를 평가합니다.

 

취약점진단관련 표준가이드 종류 3가지

  • 주요정보통신기반시설 (KISA)
  • 금융취약점분석평가(금융보안원)
  • 각 회사마다 보유 하고 있는 가이드를 기반 진단 수행

 

취약점 진단방법

Web, Mobile, Source code 형태 웹 동적 어플리케이션 진단 3가지

  • 블랙박스(정보 없음, nmap 포트 스캔부터 시작, 정보 획득 → 예상 시나리오를 작성 → 동적 공격시도 → 취약점 식별
  • 그레이박스 (대상정보가 주어짐)
  • 화이트박스 (대상, 아이디패스워드를 발급해놓은 상태에서 함)

 

  1. OS = UNIX ( RACEL 계열 (AIX OS, HPUX OS, 오라클리눅스))
  2. DATABASE (mysql, mariaDB, 오라클, mssql) -데이터베이스가 구조화되어있다. / 몽고DB - no sql database - 구조화X
  3. WEB (아파치, 엔진x, iis, 넵툰)
  4. WAS (톰켓, 웹스피어, 제이보스, 와일드플라이, 제우스)

 

취약점 진단 방법론

 

- 취약점 진단 진행 과정

  1. 사전협의단계
  2. 정보수집단계

COMMON PORT NUMBER

  • HTTP 80
  • FTP: (데이터 전송: TCP 20), (제어: TCP 21)
  • SSH: TCP 22
  • Telnet: TCP 23
  • SMTP: TCP 25
  • DNS: UDP 53
  • Tomcat SSL 리다이렉트: TCP 8443
  • Tomcat 관리자 디폴트 포트: TCP 8080
  • TLS (port 443)
  • SSL (port 20)
  • Web sever (port 80)

 

  • 진단정보요청 
    1. 오픈포트분석 
    2. 데몬분석 
      • 포트가 오픈되어있는데 데몬(아파치나 엔진엑스)가 없다면 무슨말일까?
      아파치나 엔진엑스 서비스 중지라서 포트를 안닫았거나 처음부터 포트자체는 그대로 두고 아파치 엔진엑스만 데몬을 중지했구나 (다시구동할 수있다) , 삭제했던거라면 포트도 삭제했어야함
    3. 계정분석

 

일반사용자계정에 대한 UID

  • OS 7,6버전은 UID 500부터 시작
  • OS 8버젼은 UID 1000번부터 시작

 3. 취약점진단단계

 

오픈포트분석 + 데몬분석 + 계정분석에 대한 최종 진단

 

이후 진단수행 → 보안담당자 인터뷰 → 시스템담당자인터뷰

 

4. 보고서작성 및 프로젝트 종료

 

 

 


취약점 진단 첫번째 STEP

 

원격터미널서비스(telnet, SSH)가 구동중인지 확인 ->  데몬이 구동중인지 확인 " ps -ef " 

 

권한부여 "644"

파일 시스템에서 파일이나 디렉토리에 대한 접근 권한을 설정하는 방식

권한 설명

  • 6: 파일 소유자에게 읽기(4)와 쓰기(2) 권한이 부여됩니다. (4 + 2 = 6)
  • 4: 그룹 사용자에게 읽기 권한만 부여됩니다.
  • 4: 다른 사용자에게도 읽기 권한만 부여됩니다.

 

 

root:x:0:0:root:/root:/bin/bash

암호화여부 | UID | GID | 계정정보 | home directoy | shell 상태(지정여부)

 

 

passwd 파일

  • Unix/Linux 시스템에서 사용자 계정 정보와 관련된 파일
  • 이 파일에는 각 사용자의 계정 이름, 암호화된 비밀번호, 사용자 ID (UID), 그룹 ID (GID), 사용자 정보(예: 이름), 홈 디렉토리 경로, 기본 셸 등이 포함되어 있습니다.
  • 일반적으로 이 파일은 /etc/passwd 경로에 위치하며, 시스템의 사용자 관리에 중요한 역할을 합니다.
  • 보안상의 이유로 암호는 일반적으로 /etc/shadow 파일에 저장

 

주요정보통신기반시설 보고서에 따르면 passwd 권한 644 이하 일 경우 "취약" 이다.

하지만, 타 사용자도 읽기 권한이 있지만 변경을 할 수 없기 떄문에 양호 처리한다.

 


 

NFS(Network File System)는 네트워크를 통해 파일 시스템을 공유하는 프로토콜

 

netstat -tlnp 명령은 리눅스 또는 유닉스 시스템에서 네트워크 연결 상태를 확인하는 데 사용됩니다


netstat -tlnp
tcp / listen / network / PID

  • -t: TCP 연결 표시
  • -l: 수신 대기 중인 소켓 표시
  • -n: 숫자 형식으로 IP 주소 및 포트 번호 표시
  • -p: 해당 연결을 사용하는 프로세스의 PID와 이름 표시


RPC서비스(remote procedure call) : 

  • 서버 내 rpc 서비스가 존재 할 경우 내부 네트워크를 통해 Client 가 요청해서 서비스를 구동할 수 있음

 

XINETD / INETD (인터넷 슈퍼 데몬) : 

  • 서버 내부 XINETD / INETD 데몬이 구동중이고 디렉터리내 "r"(remote) Command 서비스가 등록되어 있을 경우 외부네트워크를 통해 Client가 요청해서 서비스를 구동할 수 있음

 

rpc.statd 서비스 : 

  • rpc 서비스에 대한 모니터링 관장하고 있고 추가적으로 NFS 서비스의 인증/인가 시 잠김상태를 확인 할 수 있음

rpc.locked 서비스 : 

  • NFS 서비스의 잠김 해제

 

UNIX 계열에서 안전하게 root 권한을 획득하는 방법

 

1. 일반 사용자 계정으로 로그인
2. "wheel" root 권한이 필요한 사용자만 추가가 되어있어야함
3. /bin/su 파일 내 "su" 관련 설정의 주석이 제거되어있어야 함
4. /bin/su 파일 그룹에 "wheel" 이 설정되어 있어야 함

구동이 되고 있는 데몬을 확인

  • ps -ef | grep nfs

 

포트 80에서 구동되는 httpd는 웹 서버 소프트웨어(예: Apache)를 나타내며, 이는 HTTP 요청을 처리합니다.

  • 0.0.0.0: 모든 IP 주소에서의 연결을 수신할 수 있음을 의미합니다. 즉, 서버의 모든 네트워크 인터페이스에서 요청을 받을 수 있습니다.


rpcbind 서비스 : 

  • rpc 관련 데몬을 실행 시 각각의 rpc 마다 주소를 부여해주고 매핑해주는 서비스 

 

 


CUPS(Centralized UNIX Printing System)는 인쇄 서비스를 제공하는 시스템으로, 다음과 같은 포트를 사용합니다:

  • 포트 631 (IPP): Internet Printing Protocol(IPP)을 통해 프린터와의 통신에 사용됩니다. CUPS는 이 포트를 통해 클라이언트와 인쇄 서버 간의 요청 및 응답을 처리합니다.
  • 포트 25 (SMTP): Simple Mail Transfer Protocol(SMTP)로, 이메일 전송에 사용됩니다. 일반적으로 메일 서버 간의 메시지 전송에 사용됩니다.


root 계정으로 Apache Daemon을 구동할 경우 다음과 같은 문제가 발생할 수 있습니다:

  1. 보안 취약점: 웹 서버가 root 권한으로 실행되면, 공격자가 취약점을 이용해 서버를 해킹할 경우 시스템 전체에 대한 접근 권한을 얻을 수 있습니다. 이는 데이터 유출, 시스템 손상 등의 심각한 보안 문제를 초래할 수 있습니다.
  2. 불필요한 권한: Apache는 일반적으로 웹 페이지를 제공하는 데 필요한 최소한의 권한만 필요합니다. root 권한으로 실행하면 불필요하게 높은 권한을 부여하게 되어, 의도하지 않은 작업이 발생할 위험이 있습니다.
  3. 서비스 중단: 웹 서버가 root 권한으로 실행 중일 때, 잘못된 설정이나 코드로 인해 서버가 중단될 경우, 전체 시스템에 영향을 미칠 수 있습니다.
  4. 감사 및 로그 추적 어려움: root 권한으로 실행되는 프로세스는 로그 추적 및 감사가 어려워질 수 있습니다. 이는 문제 발생 시 원인 분석을 복잡하게 만듭니다.

이런 이유로 Apache는 일반적으로 www-data와 같은 비특권 사용자 계정으로 실행하는 것이 권장

 

 


@@@@@중요@@@@@
UNIX 계열에서 Daemon을 설치하는 방법은 여러 가지가 있지만, 두 가지 일반적인 방법은 다음과 같습니다:

  1. YUM (Yellowdog Updater Modified):
    • YUM은 RPM 패키지 관리자를 사용하는 리눅스 배포판에서 소프트웨어를 설치하는 데 사용됩니다. YUM을 사용하면 리포지토리에서 패키지를 자동으로 다운로드하고 설치할 수 있습니다.

rpm -qa | grep httpd

 

이 정보를 통해 어떤 버전의 Apache HTTP 서버가 설치되어 있는지 확인할 수 있습니다

 

httpd-2.2.15-69

Major -Minor

 

 

2.  소스 코드에서 직접 컴파일 (git) 

 


rsyslogd는 리눅스 및 UNIX 계열 시스템에서 로그를 수집하고 관리하는 데몬입니다. 운영 체제의 로그는 크게 두 가지로 나눌 수 있습니다:

  1. 시스템 로그 (System Logs):
    • 운영 체제와 관련된 이벤트나 오류 메시지를 기록합니다. 예를 들어, 커널 메시지, 서비스 시작/종료, 하드웨어 오류 등이 포함됩니다. 일반적으로 /var/log/messages, /var/log/syslog와 같은 파일에 저장됩니다.
    • ex)message, lastlog, wtmp, utmp, btmp, cron 등등 
  2. SU (SU Logs)
  • "su" 명령어를 실행한 로그


Automount 2가지 분류

  • Local (디렉터리, 파티션, 디바이스 등)
  • Network (같은 네트워크 내 타 서버 및 Client에 대한 디렉터리, 파티션을 마운트)

 

 

NFS를 사용하려면 클라이언트 시스템에서 서버의 파일 시스템을 마운트해야 합니다. 이를 확인하기 위해 df -h 명령을 사용할 수 있습니다.

  • df -h 명령: 현재 시스템의 파일 시스템 사용량 및 마운트 상태를 보여줍니다. 이 명령을 실행하면 각 파일 시스템의 크기, 사용량, 남은 공간, 마운트 지점 등을 확인할 수 있습니다.


mysqld_safe

  • mysql 실행하기 이전에 프로세스 구성상 문제가 있는지 확인 + 패스워드 잊었을때 안전모드에서 초기화가 가능하게 만들어줌
  • mysql은 소캣 통신을 한다. (소켓파일은 최고권한을 가지고 있어야함) --> success or error log 

 

  • postfix : 메일 전송 에이전트(MTA)로, 이메일을 전송하고 수신하는 데 사용되는 소프트웨어, Postfix가 시스템 자원을 소모하는 불필요한 서비스
  • qmgr : 매일 서버가 구동이 되고나서 메일을 주고 받기 위해 메시지 q 가 있어야 함
  • apache : OS 안에 아파치가 포함되어있음 
  • crond : 주기적 예약작업
  • atd : 단일예약작업
  • certmonger : 모니터링하는쪽
  • mingetty : 원격 연결에 대한 허용지점을 다수로 채널로 열어놓고 있는 것
  • gdm : 서버가 GUI 환경이 감희된 것으로 구성이 된것이다. - 보통은 CLI 환경에서만 함
  • gnome : 이거 보면 무조건 GUI 가 있다고 생각하면됌
  • pam : 패스워드 복잡도 설정, 잠금 임계값을 관장하는 것

 


 

  • sync 데이터 자체를 동기화하기 위함
  • shutdown 버튼 눌렀을때 꺼지는거
  • halt 강제종료 
  • lp (local printer): 계정이 존재하지만 로그인할 수 없는 상태 라서 nologin 파일(불필요한) 이 있어도 양호처리 한다.
  • ntp : 시간 동기화  - 안되있으면 트레이싱 하기 불편해짐


로그인 가능계정 리스트업

cat /etc/passwd | grep bash

 

 

 

일반 사용자 권한

  • RedhetLinux 6,7 계열 : UID 500 이상 일반사용자 계정 
  • RHEL 8 계열 : UID 1000 이상 일반사용자 계정


로그인 사용 기록을 확인


ls -al /root/.bash* /home/adiosl/.bash*



300x250
320x100

침해사고 대응

 

SFTP (SSH File Transfer Protocol)

  • 파일을 전송하기위한 보안 채널을 제공하는 보안 파일 전송 프로토콜
  • Secure Shell 프로토콜의 일부
  • 클라이언트와 서버간에 SSH 프로토콜에 의해 설정된 연결로 파일을 전송
  • 데이터를 암호화해서 파일을 전송

Layer 2 :  MAC 주소 통신

  • MAC 주소는 모두 다르기 때문에 서로 간의 신뢰관계가 형성됩니다.

 

ARP : 네트워크에서 IP 주소를 MAC 주소로 변환하는 프로토콜

주로 IPv4 네트워크에서 사용되며, 데이터 링크 계층에서 호스트 간의 통신을 가능하게 합니다.


ARP Spoofing: MAC 주소를 기반 공격, 네트워크에서 ARP를 조작하여 데이터 전송을 가로채는 방식입니다.
Man-in-the-Middle Attack공격자가 게이트웨이 주소를 변경하여 패킷에 URL을 삽입하고, 이를 통해 데이터를 가로채거나 변조합니다. /  공격자가 두 당사자 간의 통신을 가로채고, 조작하거나 도청하는 공격 방식

 

Layer 3
BGP (Border Gateway Protocol) Hijacking:
네트워크 경로를 악의적으로 변경하여 트래픽을 가로채는 공격입니다.

 

 

응용 계층

 

DNS (Domain Name System):
TTL (Time to Live):
TTL이 짧으면 DNS 질의에 부하가 걸립니다.
TTL이 길면 DNS 질의가 줄어들어 서버에 가는 부하가 적습니다.
DNS Sinkhole: 악성 트래픽을 차단하기 위해 DNS 요청을 조작하여 가짜 IP 주소로 유도하는 기술입니다.
BGP 하이재킹 탐지
BGP 하이재킹을 탐지하기 위해서는 자신이 소유한 prefix보다 하나 작은 prefix를 모니터링해야 합니다.

 

BGP Hijacking

BGP(경계 게이트웨이 프로토콜)는 인터넷에서 서로 다른 네트워크, 즉 AS(자율 시스템) 간에 라우팅 정보를 교환하는 프로토콜입니다. 여기서 AS는 특정 조직이나 기업이 관리하는 IP 주소 대역을 의미합니다.

 

 

예상문제 BGP Hijacking 공격 대응 방안

  • IP 대역에 맞지 않는 트래픽이 발생하는지 확인
  • 갑자기 응답 패킷의 양이 변하는지 확인
  • 잘못 연결되어 리다이렉트되는 트래픽이 있는지 등을 체크하면서 꾸준히 모니터링
  • 또한, 특정한 대역만 허용하도록 하는 화이트리스트 사용

(화이트리스트: 특정한 IP 주소, 도메인, 또는 네트워크 대역만을 허용하여 접근을 제어하는 보안 메커니즘)

  • 라우팅 정보의 무결성을 보장하는 인증서를 발행하여 통신의 신뢰성을 올리는 방법

 

복원력 resilience

  • 복원성 있는 네트워크는 주어진 권한을 벗어나는 행위를 빠르게 식별하고 이러한 행위를 격리할 수 있어야 한다.
  • 복원성 있는 네트워크는 통제 가능하도록 구성되어야 하며 이를 통해 잠재적 피해를 최소화할 수 있어야 한다.

Ex) 7.7 DDos 공격은 대응할 수 있는 장치가 구성되어 있지 않았다.

  • 이때 가장 중요한 것은 탐지된 비정상 행위를 격리하되 비즈니스 연속성 보장을 위한 작업의 생존성을 보장하여야 한다.

 

제로트러스트

제로트러스트는 경계선 기반 방어체계의 한계를 극복하기 위해 구성

제로트러스트는 자산의 중요도를 따진다. 자산을 식별하고 가치를 매기는 것이 어렵다.

경계선 기반 방어쳬계의 완벽한 항복 선언 ( 경계선 기반 방어는 증가된 공격표면을 감당하지 못함)

why ? 경계선을 만들 수 없다, 다른회사들 소프트웨어 쓰는거, 클라우드 기반 등을 지켜야 하는데 경계선이 무한히 확장되었기 때문에 지킬 수가 없다. 그래서 좀 더 자른 경계를 만들어야 한다 그게 제로트러스트이다.

네트워크의 구조변화를 통한 네트워크 가시성 확보에서 시작 ( 방어 가능한 네트워크 )

 

2021년 제로트러스트 선언

누구도 믿지 않겠다는 것이다. 제로 트러스트 전략에 따르면 안전한 영역도 없고, 안전한 사용자도 없다. 내부인이라도 철저한 인증과 신원 확인을 거쳐야 한다. 네트워크를 사용할 수 있는 시스템과 정보 접근 권한도 최소화할 필요가 있다. 

 

SDN (Software Defined Network), 오버랩 네트워크

SDN과 오버랩 네트워크는 현대의 IT 환경에서 중요한 역할을 하며, 네트워크 관리의 효율성을 높이고, 변화하는 비즈니스 요구에 신속하게 대응할 수 있게 해줍니다. 이러한 기술들은 특히 클라우드 컴퓨팅, 데이터 센터, 그리고 대규모 네트워크 환경에서 큰 주목을 받고 있습니다.

 

Root DNS

DNS의 역할: DNS(도메인 네임 시스템)는 도메인 이름을 IP 주소로 변환하여 인터넷에서의 통신을 가능하게 합니다.


DNS 서버의 종류: DNS 서버는 다양한 도메인 최상위 도메인(TLD)을 관리합니다. 예를 들어, .com, .net, .org 등의 도메인을 담당하는 DNS 서버가 있습니다.

 

13개의 DNS 서버
구성: 총 13개의 DNS 서버가 있으며, 이 서버들은 각각 특정 TLD를 관리합니다. 이들 서버는 고유한 IP 주소를 가지고 있으며, 도메인 네임에 대한 정보를 응답합니다.


책임 분담: 각 DNS 서버는 특정 도메인에 대한 요청을 처리합니다. 예를 들어:
.com TLD를 담당하는 DNS 서버
.net TLD를 담당하는 DNS 서버
.org TLD를 담당하는 DNS 서버

 

응답 주소: 각 DNS 서버는 해당 TLD에 대한 도메인 이름의 IP 주소를 응답할 수 있습니다이 주소는 로그에 기록된 IP 주소들로 나타납니다.


요약
DNS 서버: 총 13개, 각각 특정 TLD를 관리
TLD 종류: .com, .net, .org 등
기능: 도메인 이름을 IP 주소로 변환하여 응답
응답 주소: 각 DNS 서버는 고유한 IP 주소를 가지고 있으며, 해당 도메인에 대한 정보를 제공

 

** CCTLD는 "Country Code Top-Level Domain"의 약자로, 국가 또는 특정 지역에 대한 도메인 네임을 나타내는 최상위 도메인입니다.

 

 

DNS 프로세스 흐름


DNS 요청:

사용자가 PC에서 http://www.naver.com에 대한 DNS 요청을 합니다.
DNS 서버로 요청 전송:

PC는 설정된 DNS 서버(168.126.63.1)에 http://www.naver.com의 IP 주소를 요청합니다.
DNS 서버의 처리:

168.126.63.1 DNS 서버는 자신의 레코드에 해당 도메인 정보가 없으므로, 다른 DNS 서버(예: 루트 DNS 서버 또는 TLD DNS 서버)에 요청을 전달합니다.
응답 수신:

최종적으로, 해당 도메인에 대한 정보가 있는 DNS 서버에서 http://www.naver.com의 IP 주소를 찾아서 168.126.63.1 DNS 서버로 응답합니다.
PC로 응답 전달:

168.126.63.1 DNS 서버는 찾은 IP 주소를 PC로 다시 전달합니다. 이제 PC는 http://www.naver.com에 대한 IP 주소를 알고, 해당 웹사이트에 접근할 수 있습니다.

 

 

PC -> 설정된 DNS서버 -> Root DNS or TLD DNS server (IP GET) -> 설정된 DNS 서버 -> PC (사이트 접근)

 

 

 

Firewall(정책을 걸어서 끊는다) - > IDS (string기반 침입 탐지장치) - > IPS( IDS + active response ((TCP 통신을 reset 기반 통신차단 기법을 이용해 통신을 차단하는 장치)

 

 

패킷에는 타임스탬프가 없고 피캡에는 있다.

 

패킷:
일반적으로 패킷 자체에는 타임스탬프 정보가 포함되어 있지 않습니다. 패킷은 전송된 데이터의 기본 단위로, 수신 시각이나 생성 시각 같은 메타데이터를 포함하지 않습니다.
피캡 파일:

피캡 파일(.pcap 형식)은 네트워크 패킷을 캡처하여 저장하는 파일로, 각 패킷의 전송 시간 정보를 포함할 수 있습니다. 이 파일은 패킷 분석 도구(예: Wireshark)를 사용하여 열어볼 수 있습니다.

 

타임스탬프 옮기기
타임스탬프를 피캡 파일에 옮기는 작업은 다음과 같은 절차로 진행됩니다.

패킷 캡처:
네트워크 트래픽을 캡처하여 피캡 파일로 저장합니다. 이때 각 패킷의 수신 시각이 타임스탬프로 기록됩니다.

 

타임스탬프 추출:
피캡 파일에서 각 패킷의 타임스탬프를 추출합니다. 이를 위해 Wireshark와 같은 패킷 분석 도구를 사용할 수 있습니다.

 

타임스탬프 저장:
추출한 타임스탬프를 각 패킷에 대응하여 별도의 파일이나 데이터베이스에 저장할 수 있습니다. 이 데이터는 나중에 패킷 분석 시 유용하게 활용될 수 있습니다.

 

분석:
타임스탬프 정보를 활용하여 패킷의 전송 시간, 지연 시간, 패킷 손실 등을 분석할 수 있습니다.

 

 

1. 싱크홀(Sinkhole)
네트워크 보안에서 싱크홀은 악성 트래픽을 특정 서버로 유도하여 분석하거나 차단하는 기술입니다. 이를 통해 공격을 감지하고 방어할 수 있습니다.

 

2. 패킷에서 존을 바라보는 이유
존(Zone): 패킷의 특정 필드에서 "존" 정보를 확인하여 해당 패킷이 싱크홀과 관련이 있는지 판단할 수 있습니다. 이 정보는 패킷의 출처나 목적지를 분석하는 데 유용합니다.

 

3. IP TTL (Time to Live)
TTL 개념: TTL 값은 패킷이 네트워크에서 얼마나 오래 살아남을 수 있는지를 나타냅니다각 라우터를 통과할 때마다 TTL 값이 감소합니다.
윈도우 vs 리눅스:
윈도우: 기본 TTL 값은 64입니다.
리눅스: 기본 TTL 값은 127입니다.
마지막 0이 될 때: TTL 값이 0이 되면 패킷은 폐기됩니다. 따라서 TTL 값을 통해 패킷의 경로를 추적할 수 있습니다.

 

4. 3-Way Handshake
정의: TCP 연결을 설정하기 위한 과정으로, 다음과 같은 단계로 이루어집니다:
SYN: 클라이언트가 서버에 연결 요청을 보냅니다.
SYN-ACK: 서버가 클라이언트의 요청을 수락하고 응답합니다.
ACK: 클라이언트가 서버의 응답을 확인합니다.
에크(ACK): 이 단계에서 클라이언트와 서버 간의 연결이 완전히 설정됩니다.

 

5. HTTP Request
푸쉬(PUSH): 클라이언트가 서버에 데이터를 전송할 때 사용됩니다. 이때 HTTP 요청이 발생합니다.

 

6. DNS TTL
정의: DNS TTL은 캐시된 DNS 레코드가 얼마나 오랫동안 유지될지를 결정합니다. 이 값이 만료되면 DNS 서버는 해당 정보를 새로 요청해야 합니다.

 

7. 기타 용어
핑(PING): 네트워크 연결을 테스트하기 위해 ICMP 프로토콜을 사용하는 명령어입니다. 네트워크의 응답 시간을 측정하는 데 사용됩니다.
신(SYN): TCP 연결 요청을 나타내는 플래그입니다.
리셋(RST): TCP 연결을 강제로 종료할 때 사용되는 플래그입니다.
에크(ACK): 데이터가 성공적으로 수신되었음을 확인하는 플래그입니다.

 

 

2예상문제 DDOS

방어자 입장에서 당할 수 잇는 공격 3가지

  • 대역폭 소진 공격 (100g 라우터에 200g들어오면 null routing 이라고 버림 --> 이는 서비스의 가용성을 저하시킵니다.)

부분차단

70G공격이 100g router에 들어오면 라우터에서 차단을 하고 쓰레기통으로 버리고 남은 통신은 정상적으로 전달이 된다.

 

대역폭소진공격에서 가용대역폭을 초과하는 공격이 들어오게 될 경우, 예를들어 20g공간에 30g가 들어오게 되면 라우터는 이 과부하를 처리할 수 없어 일부 트래픽을 차단하게 됩니다.

 

방어방법

대역폭소진공격은 가용성을 가지고 있는 상단에서만 막을 수 있다.  // 우리나라 관문체계에서는 대역폭 소지기반 대응이 다 들어가있다.

 

  • HTTP기반 공격 ( 클라이언트 ↔ 서버 관계에서)

HTTP 기반 공격은 클라이언트와 서버 간의 연결을 악용하여 서버의 자원을 소진시키거나 서비스 중단을 유발하는 공격

 

서버는 한 번에 처리할 수 있는 연결 수에 한계가 있습니다. 예를 들어초당 1,000번의 연결을 처리할 수 있는 서버가 있다고 가정할 때, 클라이언트가 초당 1,000번의 요청을 보내면 서버의 연결이 소진됩니다.

 

SYN Flood 공격:

공격자가 지속적으로 SYN 패킷을 전송하면 서버는 각 연결 요청에 대해 "SYN-ACK" 응답을 보냅니다. 이 과정에서 서버는 연결을 위한 리소스를 할당하게 되며, 이로 인해 서버의 자원이 고갈됩니다. 결국, 정상적인 클라이언트의 연결 요청을 처리할 수 없게 됩니다.

 

DDoS 공격:

공격자가 여러 클라이언트를 이용해 초당 하나씩 요청을 보내면, 서버의 연결 수를 소진시키는 DDoS(분산 서비스 거부) 공격이 발생할 수 있습니다. 이 경우, 공격자는 여러 IP 주소를 사용하여 서버의 자원을 고갈시키므로 방어가 더욱 어려워집니다.

 

3예상문제 방어방법

시그니처 기반 방어:

공격 패턴에 대한 시그니처를 설정하고, 이를 기반으로 비정상적인 트래픽을 필터링합니다. 이러한 방법은 자동으로 공격을 탐지하고 차단할 수 있는 효과적인 방법입니다.

 

대피소 동작:

대피소와 같은 시스템을 구축하여 공격이 발생했을 때 자동으로 대처할 수 있는 체계를 마련합니다. 이 체계는 공격을 감지하고, 필요한 경우 트래픽을 차단하거나 우회시킵니다.

 

프록시 및 DNS 변경:

방어를 위해 프록시 서버를 사용하고 DNS를 변경하는 방법이 있습니다. 이를 통해 공격 트래픽을 다른 서버로 우회시키고, 공격자의 IP 주소가 직접 서버에 도달하지 않도록 할 수 있습니다.

 

재방문 횟수 카운트

공격자의 재방문 횟수를 카운트하여, 일정 횟수 이상 접속하는 IP 주소를 차단합니다. 이를 통해 공격자를 식별하고 차단할 수 있습니다.

 

 

  • 국지적 DDoS 대역폭 소진 공격

 

DDoS 공격은 여러 대의 컴퓨터(봇넷)를 이용하여 특정 서버나 네트워크를 대상으로 대량의 트래픽을 발생시켜 서비스의 정상적인 운영을 방해하는 공격입니다. 국지적 DDoS 공격은 특정 지역이나 특정 네트워크에 집중된 공격을 의미합니다.
대역폭 소진:

100메가의 대역폭을 가진 네트워크에서는 공격이 명확하게 보이지만, 백지망(예: 서버의 대역폭이 매우 높은 경우)에서는 상대적으로 덜 보일 수 있습니다.


패킷 흐름:
공격자가 자신의 IP 주소(a.b.c.d)를 소스 IP로 설정하고, 피해자의 IP 주소(5.4.3.2)를 목표로 하여 DNS 쿼리를 보냅니다. 이때 패킷의 소스 포트와 목적지 포트가 53번(DNS 포트)인 경우, 해당 트래픽이 의심스러운 것으로 간주되어야 합니다.

 

*소스 포트가 53번인 경우, 이는 DNS 서버가 클라이언트로부터의 쿼리에 대한 응답을 보내고 있다는 것을 의미합니다. 그러나 공격자가 자신의 IP 주소를 위조하여 이러한 패킷을 전송하는 경우, 정상적인 DNS 쿼리와는 다른 비정상적인 트래픽 패턴이 발생할 수 있습니다.

 

방어 방법

트래픽 모니터링:
비정상적인 트래픽 패턴을 모니터링하고, 특히 DNS 쿼리에 대한 비정상적인 요청을 감지합니다. 소스 포트와 목적지 포트가 53번인 경우, 이를 즉시 차단하거나 추가 검토를 요청할 수 있습니다.

 

오픈 DNS 서버 제한:
공개 DNS 서버가 악용되지 않도록 설정을 강화합니다. 오픈 리커시브 DNS 서버의 사용을 최소화하고, 필요한 경우 IP 주소 필터링을 적용하여 접근을 제한합니다.

 

대역폭 관리:
네트워크의 대역폭을 관리하고, DDoS 공격 발생 시 자동으로 트래픽을 차단하거나 우회시키는 시스템을 구축합니다.

 

신속한 대응 체계 구축:
공격 발생 시 신속하게 대응할 수 있는 체계를 마련합니다. 예를 들어, 특정 패턴의 트래픽을 감지했을 때 자동으로 차단하거나 경고를 발생시키는 시스템이 필요합니다.

 

 

tshark: Wireshark의 명령줄 기반 패킷 분석 도구입니다.

ngrep: ngrep는 네트워크 패킷을 필터링하고 분석하는 데 사용하는 도구입니다. 일반적으로 패킷을 실시간으로 캡처하고 특정 패턴을 찾아 출력합니다.

 

 

 

*TLS(Transport Layer Security)는 인터넷 상에서 데이터를 안전하게 전송하기 위한 암호화 프로토콜


 

(2) 주요통신기반시설 점검(기술)

 

1번문제 주요정보통신 기반시설을 점검할 수 있는 자 (아닌것은?)

한국인터넷진흥원 KISA

정보공유 분석센터,

정보보호 전문 서비스 기업 (정보보호 전문 서비스 기업은 SK쉴더스를 포함 총 28기업이 있다.)

한국전자통신연구원 

 

 

주요정보통신 기반시설로 지정이 되어 있는 장소는 1년에 한번 취약점 진단을 꼭 받아야한다 

제17조(취약점 분석 및 평가 시기) → 지정 후 6개월 이내에 분석을 해야함, 매년 취약점 분석 평가를 실시해야한다.

과학기술정보통신부고시 제2021-103호:

** 법률은 선택사항이 아닌 의무사항이다.

 

 

---

2번문제 보안위협에 대해 설명하고 이것을 제거하기 위해서 설정해야할 것은?

 

Session Timeout 설정 - 383

주기적으로 세션 체크를 해서 연결이 정상적인지 확인한다 .

Session Timeout 설정 (5 이하 권고)

Session Timeout 설정 유무를 점검하여 터미널 접속 후 일정 시간(Session Timeout 지정 시간)이 지난 뒤 터미널 세션이 자동으로 종료되어 관리자의 부재(터미널 작 중 자리 비, 작업 완료 후 터미널 접속을 종료하지 않 음) 시 발생 가능한 비인가자의 터미널 접근 통제가 되는지 확인하기 위함

 

Session Timeout 정책이 적용되지 않을 경우, 관리자 부재 시 비인가자가 네트워크 장비 터미널에 접속된 컴퓨터를 통해 네트워크 장비의 정책 변경 및 제 등의 행위를 할 수 있는 위험이 존재함

 Session Timeout: 터미널 접속 후 유휴 상태 일 때 자동으로 터미널 접속을 종료하는 시간 설정

---

3번문제 SNMP(Simple Network Management Protocol) 서비스와 관련해서 라우터에 config 해야할 사항은?? - 387p

가장 좋은 방법은 사용을 안하는것

하지만 사용을 해야한다면, 보안을 해야 할 사항들 중 틀린것은?

  •  
  • Community String이 디폴트로 되어있는 것은 사용하면 안된다 ( 삭제해야함)

  • 새롭게 Community String 을 생성해야하는데 복잡하게 생성을 해야함
  • Community String의 권한은 라이트 권한을 주어서는 안된다. (필요에 의해 사용을 할 수 있어도 기본적으로 라이트 권한은 안됌)

  • SNMP를 통해서 장비에 접근할 수있는 아이피를 제한한다. access list를 통해 제한한다.

 Community String: SNMP는 MIB라는 정보를 주고받기 위해 인증 과정에서 일종의 비밀번호인 'Community String'을 사용함

---

 

4번문제 스푸핑 방지를 위해 설정해야할 아이피 주소가 아닌것은? (객관식) - 397

 

■ 장비별 조치방법 예시 공통 특수 용도 주소 차단(RFC 6890 참조)

 

0.0.0.0/8 자체 네트워크(This host on this network, RFC1122)

10.0.0.0/8 사설 네트워크(Private-Use, RFC1918)

127.0.0.0/8 루프백(Loopback, RFC1122)

169.254.0.0/16 링크 로컬(Link Local, RFC3927)

172.16.0.0/12 사설 네트워크(Private-Use, RFC1918)

192.0.2.0/24 예제 등 문서에서 사용(TEST-NET-1, RFC5737)

192.168.0.0/16 사설 네트워크(Private-Use, RFC1918)

 

---

5번문제  Directed-broadcast 차단 - 434 (단답형 주관식)

 

 Directed-broadcast 서비스 차단을 통해 DoS 공격을 방지하기 위함

Directed broadcast는 특정 서브넷에 있는 모든 호스트에게 데이터를 전송하는 방식입니다

예를 들어, 서브넷 마스크가 255.255.255.0인 경우, 192.168.1.0/24 서브넷의 브로드캐스트 주소는 192.168.1.255입니다. 이 주소로 전송하면 서브넷 내의 모든 호스트가 메시지를 수신합니다.

Directed broadcast는 네트워크 공격에 악용될 수 있으므로, 많은 네트워크에서 기본적으로 비활성화되어 있습니다.

 

스머프 공격 은 브로드캐스트

 

 Smurf 공격: 인터넷 프로토콜(IP) 브로드캐스트나 기타 인터넷 운용 측면을 이용하여 인터넷망을 공격하는 행위로 브로드캐스트에 대한 응답받을 IP 주소를 변조하여 해당 IP 주소 호스트에 DoS 공격을 감행하는 공격 기법

 

브로드캐스트 아이피 특징 :

그쪽으로 핑을 보내면 이 범위 안에 있는 호스트들에게 다 뿌린다.

그래서 스머프 공격이라는 것은 내가 공격 대상자 소스 IP를 변조해서 브로드 캐스트 아이피로 핑을 보냄,

브로드캐스트 아이피가 같은 범위 안ㅇ ㅔ있는 호스트에게 request 를 보냄

→ 이것을 받은 호스트들이 공격 reply 를 공격자가 변조를 시킨 공격 대상 IP로 공격을 보냄

 

이것을 차단하기 위해서 차단해야 하는 항목은 무엇인가?

 

 다이렉트 브로드캐스트 차단.

 


(3) 네트워크 구조 및 보안

1 bite = 2^8 = 0 ~ 255

 

7계층 : URL

4계층 : port 주소 (어느 프로그램에게 가야 하는지를 알려줌) (2 bite)

TCP/UDP : 전송 계층 프로토콜

TCP : 신뢰성 o - 말한대로 전달한다

UDP: 신뢰성 x - 말한대로 전달하지 않는다

3계층 : IP (4 bite)


URL을 입력하면, 먼저 DNS(Domain Name System)에 쿼리를 보내 해당 도메인의 IP 주소를 조회합니다.

DNS 서버는 해당 도메인에 대한 IP 주소를 반환합니다. 이 IP 주소가 목적지 IP가 됩니다.

 

 

 

1,2계층 : MAC (6bite)

 

게이트웨이(처음만나는 라우터)의 IP 주소는 알고 있고 있지만, 난 MAC 주소를 알고 싶기때문에

ARP를 사용해서 브로드캐스팅 -> 해당 IP 주소를 가진 장치가 자신의 MAC 주소를 포함한 ARP 응답을 송신 장치에게 전송합니다.

ARP (Address resolution protocol) - IP를 MAC주소으로 변환

RARP - MAC주소를 IP으로 변환

  • Gateway: 우리 PC가 인터넷 세상으로 나가기 위해서 처음 만나는 라우터(별명)
  • routing table : 라우터를 키면 BGP protocol 을 이용해 routing table에 가는 길들을 다운받는다. 라우터는 포트가 4개가 있다.
  • subnet mask: 네트워크에서 IP 주소를 서브넷으로 나누는 데 사용되는 값입니다 내 아이피 주소를 가지고 어디까지가 네트워크 주소인지를 판단할때 사용 ( 네트워크 주소와 호스트 주소 나눈 것을 판별하는 것)
  • broadcast : 네트워크에서 특정 정보를 모든 장치에 동시에 전송하는 방식입니다.
  • unicast :한 사람의 특정 수신자에게만 데이터 패킷을 전송하는 방식

인터네트워킹

라우터: 네트워크를 연결하는 장비이며, 일반적으로 3 네트워크 계층 기능을 수행

서브넷 마스크가 있기 떄문에 랜을 구별할 수 있다.

 

리피터 : 반복한다 / 랜이 너무 커서 10km가 되면 랜인 회선으로 연결되어있는데 전기신호가 10키로 동안 계속 가는건 저항이 생긴다 떄문에 중간 중간 리피터(증폭기)를 설치를 한다. - 요즘은 사용하지 않음

 

브릿지: 랜을 버츄얼하게 나누고 싶을때 사용 / 라우터의 랜을 가상으로 한 포트당 몇개씩 버츄얼 하게 하기 위해서 랜선 하나 따서 그 밑에 여러개를 묶는 것 - 요즘은 라우터 값이 싸져서 사용하지 않음

 

랜에서 시작하여 첫번째로 만나는 라우터를 게이트웨이라고함

 

라우터 설명할때는 3계층 밖에 없다 - 왜냐면, 인터넷 상에 있는 라우터들은 최종 목적지가 아니기 떄문에 네트워크 계층에서 반환되고 다시 물리적 계층으로 내려간다 (목적지 아이피 주소가 나인지 아닌지만 확인함)

 

전송 (4계층) - 신뢰성 또는 통신품질에 대해 배울 예정

오류 제어

  • 전송 오류의 유형

화자가 이야기 한 것에 대해 청자가 바르게 알아 들어야한다.

  • 수신(청자) 호스트의 응답 프레임

긍정응답프레임: 데이터가 정상적으로 도착했을때, 수신 호스트가 송신 호스트에게 회신

부정응답프레임: 데이터가 꺠져서 도착했을떄, 수신 호스트가 송신 호스트에게 회신

(부정 응답 프레임을 받은 송신 호스트는 재전송 기능으로 오류 복구 시도)

 

프레임 분실: 내가 말한 것이 통으로 없어진다. (저녁먹을래 → 저녁 … ? )

1) 송신호스트에서 프레임 분실

송신 호스트는 타임아웃 시간을 갖고 상대방의 응답을 기다리는 시간이 있음 / 타임아웃 시간이 지날때까지 응답이 없으면 데이터를 재전송한다.

송신 호스트는 내가 말한 것을 상대방이 알아들었는지 못알아들었는지 판단이 가능하다. )

2) 수신호스트에서 프레임 분실

송신 호스트에서 데이터를 전송하고 “수신 호스트”에서 긍정 응답을 주는 와중에도 데이터 손실이 발생할 수 있다. → 그럼 송신 호스트에서 데이터를 재전송한다.

 

순서 번호 (sequence number)

  • 대화의 순서번호를 저장을 해둬야한다.

송신호스트가 대화를 수신호스트에게 했는데, 수신호스트가 긍정응답을 하는 중 프레임분실이 일어난다면, 송신 호스트는 일정 시간 타임아웃을 주고 기다리다가 다시 재전송을 한다.

만약 순서번호가 없으면 데이터의 중복이 발생한다. (금전적으로 보면 돈을 두번 보내는 꼴)

전송 오류의 유형

  • 수신 호스트의 응답 프레임

부정 응답 프레임을 받은 송신 호스트는 재전송 기능으로 오류 복구 시도

송신 호스트의 타이머 기능

  • 데이터 분실시 수신호스트로부터 어떠한 응답프레임도 발생하지 않음 → 송신 호스트는 일정 시간동안 응답 프레임이 없으면 타임아웃 기능으로 재전송을 시도

순서번호의 기능

 

수신호스트가 중복 프레임을 구분 할 수 있도록 지원

 

흐름제어

  • 수신 호스트가 감당할 수 있는 속도로 송신 호스트가 데이터를 전송하도록 제어를 해야한다.
  • 너무 빨리 전송하는 경우

수신 호스트가 내부 버퍼에 보관하지 못할 수 있음 -> 이는 프레임 분실과 동일한 효과를 야기함

내가 상대방한테 데이터를 줄때 상대방이 받는 응답의 속도에 맞춰서 흐름 제어를 한다. (슬라이딩 윈도우 프로토콜)

 

1, 2 계층 프로토콜

CSMA/CD(Carrier Sense Multiple Access with Collision Detection)

이더넷 =( LAN = MAC = 1,2 계층 = 물리적) 모두 같은말이다. 

 

Dummy HUB : 인터넷을 공유한다 (BUS 구조로 되어있음)

스위칭 HUB : 나만 연결한다 - > 속도가 더미허브에 비해 빠름

 

MA(Multiple Access): 다수 호스트가 하나의 공유 매체에 연결됨

 

CS(Carrie Sense): 호스트는 공유 매체의 사용 가능 여부를 신호 감지로 확인

 

CD(Collision Detection): 공유 매체에서 데이터 충돌 여부 확인

 

공유매체(LAN)의 길이가 길면 길수록 전송 지연이 증가하여 충돌가능성이 높아진다.

 

--------

1,2 계층 = 프레임 (3 계층에서 내려온 데이터 + 헤더를 칭함)

3 계층 = 패킷 (4 계층에서 내려온 데이터 + 헤더를 칭함)

4 계층 = TCP 세그먼트 / UDP 데이터그램 (위에서 내려온 데이터 + 헤더를 칭함)

---------

1,2 계층 헤더 크기는 14byte

3계층 헤더 크기 20byte

4계층 헤드 크기 20byte

-------

0-1500바이트까지 데이터를 담을 수 있다

패킷의 최대사이즈 1500바이트 (그림에서 Data 부분)

패킷의 최대사이즈는 1500을 넘을 수 없다. 하지만 어느날 데이터가 1600이 되어 있으면 ‘비정상’적 이기 때문에 잡아내면 된다.

 

8비트 = 1바이트

 

헤더의 구성

목적지 맥주소 6byte + 소스 맥주소 6byte + type 2byte (length)

= 물리계층의 총 헤더의 길이는 14byte이다. 

헤더 뒤에는 패킷이 따라옴

 

type(Length) 이 0x0800 (숫자 하나 하나가 16진수)이면 IP에게데이터를 줘야한다.

16진수는 2^4이기때문에 = 4비트이다.

‘영’ 4비트 ‘팔’4비트 ‘영’4비트 ‘영’4비트

8비트+ 8비트 = 2바이트



 

Type(Length): 내께 맞으면 데이터를 위로 올려야하는데 OS단에는 stack, IP .. 여러개가 있는데 누구한테 줘야하는지 정해준다. (포트 역할)

 

preamble : 데이터가 가기 전에 미리 알려주는 것 = (수신 호스트가 송신 호스트의 블록 동기를 맞추는 용도)

start delimiter : 1바이트 쉬고 데이터를 보내준다 = 프레임의 시작

 

traller: LAN 카드는 OS에 영향을 받을 수 밖에 없는다 OS에는 64비트, 32비트 설정하는게 있다. 이런것은 bus의 단위를 말함. CPU하고 죽은 기기를 통신할때 1비트씩 보내는게 아닌 64비트는 64를 한번에 보낸다. 만약 버스가 있다고 하면 64의 배수가 되어야 한다. 그럼 데이터를 맞추기 위해 PAD 를 통해 0000000을 집어넣어 64틀에 딱 맞춰서 보낸다.

checksum : 무결성값을 보낸다 // 앞에서 계산한 checksum 과 뒤에서 계산한 checksum값을 비교한다. 값이 다르면 랜카드는 폐기를 한다.

 

3계층 네트워크 계층의 기능

 

서비스의 종류

  • 연결형: 종이컵 2개에 실을 연결해서 대화를 하듯 연결을 하는 것
  • 비연결형 서비스: 데이터나 경로가 미리 정해져있지않음 (데이터가 가는데 주소만 간다) - 주소만 가지고 가까운 길로 간다.

(비연결형 서비스)

  • 패킷(데이터와 헤더가 합쳐짐)이 IP주소(네트워크계층이니까) 를 가지고 서로 다른 경로로 전송되므로 도착 순서가 일정하지 않는다. -> 그래서 상위 계층(4 전송계층)에서 순서를 재조정해야한다.

IP계층의 핵심목적은 정보가 깨지는 걸 신경쓰는게 아니라 빨리 보내는 것.

  • 그렇기에, 패킷 분실 가능성이 있다
  • 패킷의 100% 도착을 보장하지 않는다.
  • 상위 계층에서 패킷 분실 오류를 복구해야한다.

IP 프로토콜

 

IP 프로토콜은 비연결형이다 = 품질을 보장하지않는다 (쿠팡맨은 보내면 끝이고 상위계층 쿠팡에서 물건을 보상해줌)

TCP 는 연결형 프로토콜(그래서 신뢰성 보장)

 

패킷을 분할/병합하는 기능을 수행한다.

IP 헤더는 32비트이다 = 32비트 = 4 바이트

0 ~ 31

 

5층으로 나누어져 있어서 4+4+4+4+4 = 총 20바이트임

맨 밑에 계층은 요즘엔 쓰지 않아 빼고 계산

 

반 바이트 = 버전 넘버

Ipv4 = 4byte

Ipv6 = 6byte

 

읽는방법 : 각 층이 끝나면 왼쪽 으로 돌아감

version number : 우리는 ipv4를 사용함 = 4byte

header length = 3계층의 해더크기는 20바이트 이다 //  1 = 4byte // 20 byte = 5

MAC source address | MAC destination address | type(length) | 패킷 (version number 4 + header length 5)

 

  • service type : 세팅값에 따라 어떤건 빠르고 어떤건 늦게 간다 (하지만 지금은 의미가 없어져서 사용하지 않는다) = 0 → 만약 숫자가 0이 아니고 1이라는 숫자가 하나라도 나오면 잡아내야함

Covert Channel Hacking 은밀한 채널 해킹: 모든 OS는 service type 이 안쓴다는 걸 알기 떄문에 해석을 하지 않음, 해석하면 속도가 느려지니까 → 해커들이 좀비pc 에 명령을 때려서 시그니처를 하는데, 데이터에 attack 명령어를 쓰는게 아니고 service type 에서 명령을 때린다. 왜냐? 아무도 사용하지 않기 때문에 걸리지 않는다.

 

  • packet length(fragment offset) : 패킷의 최대 사이즈 1500 // 8바이트 단위로 계산한다.
  • Time to live : 패킷이 살아남기 위한 시간 // 예를들어 100으로 설정되어 있으면 라우터를 지날떄마다 하나씩 깐다 0이되면 소멸한다. - 쓰레기 패킷을 없애기 위함 (전송은 안되고 라우터끼리 핑퐁을 하는 등 ..)
  • transport : TCP 를 보낼지 IP를 보낼지 적어놓고 받는쪽에 배려를 한다는 의미. 윗계층 누구한테 줘야하는지를 적어놓음
  • header checksum: hash값으로 혹시나 의심스러울때 비교를 했는데 같으면 무결성 o같지 않으면 무결성에서 어긋나서 잡아내야함 // UDP 17 TCP 6

*UDP 17과 TCP 6은 각각 UDP와 TCP 프로토콜을 식별하는 프로토콜 번호입니다. 이 번호들은 IP 헤더에서 해당 프로토콜을 구분하는 데 사용됩니다.

 

scanner : 내가 상대방을 공격하기 전에 상대방의 정보를 꺼내 오는 것 ( Nmap )

 

 

 

  • 1기가를 전송하기 위한 패킷이 몇개가 팔요한가 ?

1기가 / 1500byte (패킷의 최대 사이즈)

하지만 헤더 20을 빼면 1480 만 한번에 전송될 수 있다 =

한번에 1기가를 받지 않고 1500byte씩 나눠서 받는 이유는 중간에 전송중 에러가 나면 1500만 다시 보내면 되지만 1기가로 보낼경우 1기가를 처음부터 다시 보내야한다. 

 

  • identification: 어디 데이터에서 왔는지 식별을 한다. A B C를 한번에 다운받는다고 가정을하면. A에서 쪼개고 B에서 쪼개서 전송되고하면 섞인다. 이것을 식별하고 모으기 위한 장치
  • DF (Dont Fragment): 분할하지 마라 / 있는 그대로 전송하면되고 분할하지 마라 (쪼개서오면 잡아내면된다)

 

fragmentation attack : 분할하지않아야 하는 것을 분할해서 하는 공격.

(패턴 = rule = signiture = 침해사고 = 악성코드// 모두 같은 말)

정보보호 기술은 패턴매칭 밖에 없다

V3 백신이 하는게 헤더와 데이터에 어택이 있으면, 어택 공격을 잡아내는 것 안잡히게 하려면 fragmentation을 해서 쪼개지 않아야 할 것을 강제로 쪼갬 → 보안장비를 속여 식별이 안됌 → 끝에 가면 헤더를 때고 합치기 떄문에 공격이 된다.

 

  • MF (More Fragment?) : 전송된 데이터가 완전히 다 들어왔는지 확인하는 장치 (내 뒤에 조각이 더 있나요? 하고 물어봄- 조각이 더 있으면 1 이라고 답함 그리고 마지막에 more fragment의 응답은 0으로 끝난다. - 반드시 마지막은 0으로 끝나야한다.)

—---------------------- 문제 -----------------------

IP 프롤토콜

**분할의 예

  • IP 헤더를 제외한 전송 데이터의 크기가 380 바이트
  • 패킷의 최대 크기가 128 바이트 일경우**
  1. Identification : 우리가 설정하는 값
  2. Packet length: 패킷의 최대크기 128바이트 에서 헤더 20을 떼고 봤을때 108바이트. Fragement Offset을 구하기 위해서는 8바이트로 나눠서 정수로 떨어져야 한다. 그래서 104 로 데이터 크기를 임의로 줄여 8바이트로 나눴을때 정수로 결과가 나오게 한다. (기존 108→104로 줄이면서 남은 값들은 모아서 맨뒤에서 처리할 예정)

104 + 헤더20 = 124 가 하나의 packet legnth(패킷 길이는 헤더값을 포함함) 값이 되는 것

최종적으로 124 / 124 / 124 / 88 이 나오는데 헤더크기 20을 각각 떼고 총 합을 더하면 데이터의 크기 380바이트로 데이터 전부 정상 전송하게 된다.

 

MF (more fragment) : 너 뒤에 더 있니? 있으면 1 마지막은 무조건 0 이되어야 한다.

Fragment Offset: 8바이트로 나눠져야함/ 패킷의 최대 크기 128바이트에서 헤더 20 떼고 108바이트에서 8로 나눴을때 정수로 떨어지게 하기 위해 104바이트로 줄임 → 이값을 8바이트 단위로 나누면 104/8 = 13

오프셋은 중첩이 되어 표에 작성된다. 13 / 26 / 39 … 데이터의 크기 380바이트가 모두 전송될때까지 늘어남

결과표

transport layer (전송 계층) (4계층)

데이터 링크 계층은 물리적으로 1:1 연결된 호스트 사이의 전송이라면, 전송계층은 논리적으로 1:1 연결된 호스트 사이의 전송

 

  • 흐름 제어

물리적 계층과 비교하여 상대적으로 복잡

수신자가 슬라이딩 윈도우 프로토콜의 윈도우 하단 값을 조정

슬라이딩 윈도우 프로토콜 데이터 전송의 흐름을 제어하는 방법입니다. 이 프로토콜은 주로 TCP(전송 제어 프로토콜)에서 사용되며, 송신자와 수신자 간의 데이터 전송을 효율적으로 관리하기 위해 사용됩니다.

슬라이딩 윈도우 프로토콜의 기본 개념:

 

윈도우 크기:
슬라이딩 윈도우 프로토콜에서는 송신자가 한 번에 전송할 수 있는 데이터의 양을 "윈도우 크기"로 정의합니다. 이 윈도우 크기는 수신자가 처리할 수 있는 데이터의 양을 나타냅니다.

윈도우 하단 값:
윈도우 하단 값은 현재 수신자가 수신할 수 있는 데이터의 시작 지점을 나타냅니다. 데이터가 수신되면 이 하단 값이 이동하여 새로운 데이터가 수신될 준비가 됩니다.

 

수신자가 윈도우 하단 값을 조정하는 이유:
수신자는 자신의 버퍼 크기 및 처리 능력에 따라 윈도우 하단 값을 조정합니다. 만약 수신자의 버퍼가 가득 차면, 수신자는 송신자에게 더 이상 데이터를 보내지 못하도록 하여 데이터 손실을 방지합니다.

 

  • 오류 제어

데이터 변형, 데이터 분실 오류

재전송 기능으로 복구

빨리말하면 이해 못한다.

 

TCP 헤더 크기는 20 이다.

1480 - 20 = 1460

 

TCP

연결형 서비스를 지원

전이증(쌍방향) 방식의 가상 회선을 제공

신뢰성 있는 데이터 전송을 보장

 

TCP 헤더

1층은 4byte

TCP 헤더 크기: 4 * 5층 = 20 byte

6층// padding 은 배수를 맞춰주기 위해 사용한다. // 마지막 층은 지금은 사용하지 않는다.(제외)

TCP, UDP (4계층)의 상위 계층은 7계층(응용프로그램) 이다.

 

포트번호

  • TCP, UDP 프로토콜이 상위 계층에 제공하는 주소 표현 방식

TLS (port 443)

SSL (port 20)

 

TLS(전송 계층 보안, Transport Layer Security)는 인터넷에서 데이터의 안전한 전송을 보장하기 위해 설계된 암호화 프로토콜입니다

Well-known 포트

  • 많이 사용하는 인터넷 서비스에 고정된 포트 번호 할당

포트 숫자가 1024 보다 작으면 모두 Well-known 포트이다. (전세계 통용)

  • Source port : 보내는 쪽의 포트 // 웹서버 포트는 port 80
  • Sequence Number: 3계층 네트워크 계층까지는 데이터만 빨리가면 되었지만, 4계층에서는 데이터 전송의 신뢰성과 순서를 보장하는 데 필수적인 역할을 합니다.
  • Acknowlegement number : 말풍선 100개를 했는데 응답이 50번 까지만 받으면 100을 다 받기 위해 기다린다. 응답이 오지 않으면 51번 부터 다시 보낸다. - 상대가 어디까지 받았는지를 확인하는 것
  • Data Offset(= headerLength 20byte)
  • Reserved : 앞으로 예약된 것이 있다. (요즘은 사용하지 않아서 0 값을 넣는다)

Flag 각 1비트 (1비트는 경우의 수가 2개)

  • URG (urgent) : 패킷을 빠르게 처리 할 수 있는 방법 ( urgent 라고 빨리 보낼 수있는 것이 요즘은 없기 떄문에 사용하지 않는다 비트번호 0 으로 처리)
  • ACK : SYN 에서 의견을 물어보고 ACK 에서 대답을 한다. 응답하면 okay sign 응답을 안보내면 no
  • PSH (push) : 해더 해석이 다 되었으면 상위계층으로 올릴때 사용
  • RST (reset): 급한일이 있을때 너랑 이야기 안하고 끝남 FIN은 1의 신호를 받아야끝나지만 이건 내가 통보하는 방식임
  • SYN : 0하고 1밖에 없다고 가정하면, 나는 너하고 이야기하고 싶어라고 신호 1(말풍선)을 던지는 의견을 물어봄
  • FIN (finish) : 할말 다 끝나고 FIN을 1로 보내면 그 이후에 내가 어떤말을 하든 간에 듣지 못한다.
  • Window : 슬라이딩 윈도우 프로토콜과 같음 // 상대방이 초당 100 마디하면 난 능력이 안되 초당 50마디만 말해줘 라고 제어해주는 흐름제어장치
  • Checksum : 무결성을 확인하기 위함
  • Urgent Pointer : URG가 1이 되었을때 사용, 급한 일이 있을떄 사용하기 위함 // 요즘은 URG 를사용하지 않기 떄문에 비트번호가 0 이 되어야한다.

Sequence Number 는 정하기 나름 (보통 1로 시작)

  • Sequence number
  • ACK number : 다음에 수신하기를 원하는 데이터를 지정

6계층에서 내려온 것을 캡슐로 싸면 캡슐라이제이션


UDP - 8byte

비연결형 서비스를 제공

Best effort (빨리만 보내면 된다) 전달방식을 지원

실시간적 중요성을 하기 위해 생김 (헤더 처리가 없기 떄문)

신뢰성이 의미가 없을때 빨리 하기 위해서 사용

지금의 모든 것들은 TCP 를 사용한다.

지금 실시간 방송은 TCP 를 사용 // 엄밀히 따지만 실시간은 아니다 UDP를 사용해야함

ex) 프랑스에서 금메달 땃으면 바로 주는게 아니고 2~3초동안 데이터의 분실이 있나 확인하고 송출한다.

해커들이 명령어 때릴 떄는 UDP 를 사용한다 ( 응답을 받을 일이 없기 때문)



SYN Flooding

SYN Flood는 반개방 공격이라고도 하며, 보낸 SYN 요청에 대한 서버의 SYN-ACK에 응답하지 않고 SYN 요청만 마구잡이로 보내는 네트워크 계층 공격입니다. 결과적으로 많은 수의 열린 TCP Connection으로 인하여 서버의 리소스가 과도하게 소모되어 정상 트래픽의 처리를 어렵게 하면서 정상적인 새로운 Connection을 열 수 없으며, 이미 연결된 사용자의 Connection의 경우에도 서버가 올바르게 작동하기 어렵게 됩니다.

 


(4) 웹 구조 및 보안

 

1번문제 GET POST 메소드

HTTP 프로토콜에서 클라이언트가 서버에 요청을 보내는 두 가지 방법

GET :

  • GET 요청은 서버에서 리소스를 가져오는 데 사용됩니다. 일반적으로 GET 요청은 본문이 필요하지 않습니다. 요청할 URL만으로도 충분히 서버가 어떤 리소스를 반환해야 하는지를 알 수 있습니다.
  • 파라미터 값이 한줄으로 나온다. (글자수 제한 255자가 있다)

https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=test

 

POST : 

  • 파라미터 값이 안보이게 숨겨져있음 (어떤 인자값이 날라가는지 보이지 않기 때문에 안전하다고 하지만 web proxy tool을 사용할 경우 전부 보이기 떄문에 공격자 입장에서는 GET과 POST는 의미가 없습니다. (글자수 제한이 없다 서버적으로 보내야할 데이터가 많으면 POST 사용)

https://search.naver.com/search.naver

 

2번문제 응답값 200ok 

HTTP Version | 상태코드 | 코드설명

  • HTTP Version: 1.1: 현재 사용 중인 HTTP 프로토콜의 버전을 나타냅니다. 여기서 1.1은 HTTP/1.1 버전으로, 웹에서 가장 많이 사용되는 버전 중 하나입니다. HTTP는 주로 1.0, 1.1, 2.0, 3.0 등의 버전이 있습니다.
  • 상태 코드: 서버가 클라이언트의 요청을 처리한 후, 요청의 결과를 숫자로 표기하는 것입니다. 예를 들어:
    • 200 ok: 요청이 성공적으로 처리되었음을 의미합니다.
    • 404 not found: 요청한 페이지를 찾을 수 없음을 의미합니다.
    • 500 error: 서버 내부 오류가 발생했음을 의미합니다.
  • 코드 설명: 상태 코드에 대한 설명을 제공합니다. 예를 들어, 200 상태 코드는 "OK"라고 설명하며, 이는 요청이 성공적으로 처리되었음을 나타냅니다.

3번문제 File download 취약점 

파일 다운로드 취약점이란 서버에 업로드 된 파일을 다운로드 받을 수 있게 만들어진 서비스를 이용하여, 정해진 파일이 아닌 다른(시스템 파 일, 소스 코드 등)파일을 다운로드 받을 수 있는 취약점이다.

다른파일은 시스템파일(etc의 패스워드 파일, hosts 파일 같이 없어서는 안되는 파일들) 이나 소스 코드가 될 수 있다.

개발자가 의도하지않게 다른 파일을 의도하는 것

 

**커멘드 인젝션- 개발자가 의도하지않게 다른 파일도 같이 수행하는 것

 

기존 URL

http://freehack.bug/board/board_down.php3?file_name=c99.php

 

공격 실행

URL에 아래와 같이 작성하면 루프가 돌면서 etc/passwd 파일을 받을 수 있음

http://freehack.bug/board/board_down.php3?file_name=/../../../../../../etc/passwd 

 

./ 를 강제로 지우는 아래와 같은 코드가 있으면

-> ..// 이런식으로 두번 적으면 ./ 가 지워져도 ./ 한묶음이 남기 때문에 우회할 수 있다.

 

 

4번문제 Cross Site Script (CSRF) - client side

Cross Site Request Forgery, 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.

ex) 회원 정보 수정, 데이터 수정 또는 삭제, 비방/욕 댓글

 

- 해커의 악의적인 스크립트 게시글을 관리자가 읽으면 관리자 계정의 비밀번호가 해커가 설정한 비밀번호로 바뀔 수 있다.

- 클라이언트 사이드에서 계정정보를 바꾸는 공격 -> 클라이언트의 정보가 목표, 서버의 공격이 아니다.

 

  • 해커가 아래 스크립트를 이용해 악의적인 게시글(본문에 스크립트 삽입)을 작성한다.
  • 관리자가 게시글을 읽으면 아래의 스크립트에서 설정한 것처럼 관리자 계정의 비밀번호가 12345 로 바뀐다.

 

Server Side Request Forgery (SSRF) - server side

SSRF는 Server Side Request Forgery의 약자로 유사한 이름을 가진 CSRF(Cross Site Request Forgery) 와는 다르게 클라이언트 측의 요청 을 변조시키는 것이 아닌 서버 측 자체의 요청을 변조하여 공격자가 원하는 형태의 악성 행위를 서버에 던져주면 서버가 검증 없이 그대로 받아 그의 따른 행동/응답을 해주는 공격

 

* 공격자가 내부망에 있는 서버를 접근 하기 위해서는 직접 접근은 불가 (방화벽, IDS, IPS …. 등) 보안장치가 많다. 심지어 해커(공인아이피)에서 server(사설아이피) 가 보이지도 않는다.

-> 중간에 있는 server의 취약점(매개체역할)을 통해 서버(사설 아이피)를 공격할 수 있다.

보안대책

  • 내부 시스템과 상호 작용하는 변수에 불필요한 값이 입력될 경우 무효처리를 해야 됨
  • 변수에 입력된 주소가 올바른 주소가 맞는지 즉 신뢰하는 주소가 맞는지 재검증을 해야 됨

실습에서 hacker.bug 가 믿어도 되는 URL인지 확인할 수 있는 로직을 삽입해야한다.

접근할 수 있는 사이트만 접근할 수 있게하고 접근하면 안되는 사이트는 전부 거절 (화이트리스트)

정상적인 요청으로 공격하기 때문에 웹 방화벽에서 통제가 되지 않는다.

  • 여러 우회 공격 기법 중 대상 사이트에 대한 신뢰할 수 있는 도메인과 루프백 주소를 매칭하여 지정해둔 도메인을 요청하는 경우가 존재하기 때문에 요청 시 도메인 이름에 대한 검증도 수행

 

 

5 ???

 


(5) 정보보호 법 제도

망법 - 정보보호최고책임자, 정보보호 관리체계 인증(자세히보기)

개인정보보호법 - 정의, 수집/이용, 제공, 유출신고, 개인정보 책임자, 가명정보

https://brandonlog.tistory.com/101

 

 

 

@@ 정보보호 최고 책임자

정보보호 최고책임자는 대통령령에 의거 과기정통장관에게 보고해야하는데 -> 매출액, 회사 규모가 크면 안해도 됌(근데 시가총액큰애들은 겸직 금지임) -> 근데 정보보호 관련 업무는 또 겸직이 된대

 

정보보호 최고책임자는 다음 각 목의 업무를 총괄한다.

가. 정보보호 계획의 수립, 시행 및 개선

나. 정보보호 실태와 관행의 정기적 감사 및 개선

다. 정보보호 위험의 식별 평가 및 정보보호 대책 마련

라. 정보보호 교육과 모의 훈련 계획의 수립 및 시행

 

@@ 정보보호관리체계인증

 이 사람들은 제1항에 따른 인증을 과기정통장관에게 받아야한대 - 근데 국제인증이나 정보보호조치를 취했으면 일정부분 생략이 된대

  1. 전기통신사업을 하는 양반
  2. 집적정보통신시설 하는 양반
  3. 정보통신서비스 부분 일정 수준 넘는 놈들
     

정보보호관리체계인증 유효기간은 3년 다만 정보보호 관리등급을 받은 경우, 유효기간동안 제1항의 인증을 받은 것으로 간주한다.,

 

이래놓고 장관 일 능률을 위해 인증기관을만들어서 (KISA) 인증심사를 정해놓고 대리맡긴다네

 

인증기관들은 연 1회이상 사후관리를 실시하고 장관한테 보고해야한대 (KISA, 정보보호관리체계인증기관(SK쉴더스), 정보보호관리체계심사기관

 

장관은 정보보호관리체계인증 취소가 가능한데, 거짓, 인증기준미달, 사후관리 거부를 하면 취소한대 

 

@@ 개인정보보호법

개인의 자유와 권리를 보호하고, 나아가 개인의 존엄과 가치를 구현

 

개인정보 -> 살아있는 개인의 정보

  1. 개인을 알아볼 수 있는정보 
  2. 성명, 주민번호, 영상
  3. 결합하여 알아볼 수 있는 정보
  4. 가명정보 (가명처리: 개인정보 일부를 삭제해서 추가 정보 없이 개인을 알아볼 수 없음)

 

정보주체 권리 (처리에 관한 정보제공받을권리, 동의 여부 선택권리, 개인정보 열람권리, 처리정지,파기요구권리, 처리로인한 피해 구제받을 권리, 결정거부 및 설명요구 권리

 

@@정보 수집 및 이용

정보주체의 동의를 받거나 법령 또는 생명,재산 등 불가피한 경우, 개인정보처리자의 정당한 이익달성을 위한경우

 

정보 동의를 받을 때 정보주체에게 알려야할 목록

  1. 수집 이용목적
  2. 수집하려는 개인정보 항목
  3. 개인정보 보유 및 이용기간
  4. 동의 거부 권리 및 동의거부에 따른 불이익 내용

 

개인정보처리자는 정보주체의 개인정보를 제3자에게 제공할 수 있다. - 동의받았을때, + 대통령령으로 정하는 바에 따라 정보주체 동의없이 개인정보를 제공할 수 있다.

 

 

@@가명정보

개인정보처리자는 정보주체의 동의없이 가명정보를 처리할 수 있다.

3자에 제공하는 경우 특정 개인을 알아볼 수 있는 정보를 포함해서는 안된다.

연구를 위한 가명 개인정보처리자들의 통합은 전문기관에서만 수행한다.

 

개인정보처리자는 가명정보를 처리하고자하는 경우 / 가명정보처리목적, 제3자 제공시 제공받는 자, 가명정보의 처리기간 등 관련 기록을 보관해야하고 가명정보를 파기한 경우 파기날부터 3년 이상 보관하여야한다.

 

@@유출신고

개인정보처리자는 개인정보가 유출되면 정보주체에게 알려야한다. 

  1. 유출항목
  2. 시점과 경위
  3. 발생할 수 있는 피해를 최소화하기 위한 정보주체가 할 수 있는 방법에 대한 정보
  4. 대응조치 및 피해 구제절차
  5. 피해가 발생할 경우 신고 등을 접수할 수 있는 담당부서 및 연락처

 

개인정보처리자는 개인정보 유출을 알게 되었을 경우 72시간내에 서면등의 방법으로 전문기관(KISA)에 신고해야한다. , 천재지변시는 그 이후 신고해야함 / 정보주체 권익 침해 가능성이 자체조사에서 낮아졌다고 판단하면 신고 안해도됌

 

@@ 개인정보보호책임자

개인정보처리자는 개인정보보호책임자를 임명해야함

  1. 보호 계획의 수립 및 시행
  2. 처리실태 및 관행의 정기적 조사 및 개선
  3. 개인정보처리관련 불만의 처리 및 피해구제
  4. 유출 및 남용방지를 위한 내부통제시스템 구축
  5. 개인정보보호 교육계획의 수립 및 시행
  6. 관리 감독

 

해외 법인회사들은 개인정보 처리에 관한 국내대리인을 문서로 지정해야한다. 

  1. 개인정보 보호책임자의 업무
  2. 개인정보 유출 등의 통지 및신고
  3. 물품 서류등 자료의 제출 (국내 대리인은 국내 영업소가 있어야함)
  4. 국내 대리인 성명, 주소(영업점), 전화번호 및 전자우편주소 

국내대리인이 법을 위반한 경우 개인정보처리자가 그 행위를 한 것으로 본다.

 

 

 


 

(6) 시스템 보안 및 취약점 진단

 

 

Assembly 기계어와 일대일로 대응이 되는 컴퓨터 언어

 

레지스터 : CPU내에 존재하는 기억장치로 메모리 외 빠른 데이터 저장 및 읽기가 가능한 장치

 

범용레지스터: 연산 결과 저장, 산술 논리 연산, 주소 저장 등 다목적으로 사용

인덱스레지스터: 메모리 내 데이터 접근 시 주소를 가리킬 때 사용

 

RIP는 "Instruction Pointer"의 약자로, 현재 실행 중인 명령어의 주소를 가리키는 레지스터

 

fastcall : 레지스터에 사용할 인자를 적어서 사용한다

 

  • PUSH: 스택에 데이터를 추가하는 연산.
  • POP: 스택에서 데이터를 제거하고 반환하는 연산.

ESP: 스택의 최상위(top)를 가리키며, 함수 호출 및 리턴, 변수 저장 및 로드 시에 사용됩니다.

EBP: 스택의 최하위(bottom) 또는 함수의 스택 프레임의 기준 지점을 가리키며, 함수의 로컬 변수나 인수에 접근할 때 기준이 됩니다.

 

LEA 

메모리 주소를 계산하여 레지스터에 로드하는 데 사용되는 어셈블리 언어의 중요한 명령어입니다. 

이를 통해 복잡한 주소 계산을 간편하게 수행, 포인터 연산이나 배열 처리에 유용합니다. 

(두줄로 적어야 할 코드를 LEA 를 사용하면 한줄에 요약해서 적을 수 있다.)

 

1번문제 Canary

  • 스택 오버플로우 보호 완화 기법(mitigation)
  • 함수 호출 시 카나리 값을 스택 프레임의 최상단에 저장, 함수 종료 시 스택 오버플로우를 검사

Master Canary

  • 로컬 카나리는 함수 종료 시 검사를 위해 마스터 카나리와 비교 -> 값이 다르면 스택오버플로우가 발생했다고 판단하고 프로그램을 비정상 종료시킴 (stack smashing detected error 발생)
  • 일반적으로 마스터 카나리는 전역 공간에 저장되나 쓰레드에서는 마스터 카나리가 스택 영역에 저장

 

그렇다면 카나리를 우회하는 법이 있을까?

만약 카나리의 값과 마스터카나리값을 동일한 문자로 덮어버린다면 우회할 수 있다.

 

2번문제 ROP (Return Oriented Programming) 공격은 어떨때 사용가능한가

  • ROP는 주로 실행 방지 메커니즘(NX 비트 등)을 우회하기 위해 사용됩니다. 이 기술은 악의적인 코드를 직접 삽입하는 대신, 기존의 실행 가능한 코드 조각(“gadget”)을 사용하여 원하는 동작을 수행합니다. - 버퍼오버플로우 취약점 이용
  • 스택 주소는 실행 할 수가 없는데 코드영역은 CPU가 실행시켜야 할 코드가 들어가있으니 리턴할떄 쉘코드를 스택에 쓰고 스택으로가는게 아니라 코드영역으로 가면 어떨까 하는것
  • Idea: 바이너리에 존재하는 코드를 재활용
  • “Gadget”: pop rdi ; pop rsi ; ret
  • 스택을 공격자가 조작한 입력으로 overwrite
  • “gadget”을 연결해 프로그램 실행 흐름 조작

 

3번문제 Use After Free

 Dangling pointer: 해제된 영역의 포인터를 가리키고 있는 포인터

 해제된 영역의 포인터를 계속 들고 읽을 수 있다면?

 

댕글링포인터와 관련이 있다.

 

이미 해제된 포인터인데 그 값을 계속해서 가지고 있기 때문에 1번으로 다시 읽어도 읽을 수 있는데 심지어 1번에 새드가 저장되어있고 2번해도 새드가 잘 나온다.

4번문제 Seccomp

프로세스가 사용할 수 있는 시스템 콜을 제한하는 샌드박스 보안 기능

(메모리보호기능은 아니고 샌드박스 보안기능임)

  • 리눅스 커널 샌드박스 보안 기능
  • 프로그램을 보호된 영역에서 동작해 시스템이 조작되는 것을 방지
  • 프로세스가 사용할 수 있는 시스템 콜을 제한

 

5번문제 Timing-based Side Channel Attack

  문자열씩 비교하면서 값이 다르면 프로그램 종료, 값이 같으면 기다리게 만듬
-> 타임아웃을 통해 flag 검출한다 / 시간이 오래걸리면 첫 문자열이 f 겠구나 하고 체크하고 넘어갈 수있음
(시간의 차를 기반으로 플래그를 읽어내려고 함)

 

실행시간을 비교한다

정상적일떄는

같은값이면 계속 본다.

정상작동하는지 시간을 비교한다.

 


(7) 리눅스 기초

 

1번문제 ARP

IP 네트워크 주소를 데이터 링크 프로토콜에서 사용하는 하드웨어 주소(Mac addr) 에 매핑하기 위해 인터넷 프로토콜 에서 사용하는 프로토콜입니다

 

ping 10.0.2.17 (목적지 아이피주소)

나의 IP 주소 10.0.2.15

목적지 IP 주소 10.0.2.17

출발지 MAC주소는 (나의 MAC주소)

내부망에 있는 10.0.2.17 에게 ICMP 패킷을 전송한다는 말

패킷전송을 하려면 목적지 MAC 주소가 필요하다. → 어떻게 알아내냐면 ARP 브로드캐스트 를뿌려서 알아낸다. (누가 10.0.2.17을 가지고 있어? whohas)

2번문제 top의 CPU 점유율

3번문제 free명령어 결과설명

리눅스에서 free 명령어는 시스템의 메모리 사용 현황을 보여줍니다. 주로 다음과 같은 정보를 제공합니다:

  1. total: 총 메모리 용량.
  2. used: 사용 중인 메모리 양.
  3. free: 사용 가능한 메모리 양.
  4. shared: 여러 프로세스 간에 공유되는 메모리 양.
  5. buff/cache: 파일 시스템 캐시와 버퍼에 사용되는 메모리 양.
  6. available: 현재 유저 프로세스가 사용할 수 있는 메모리 양.

Available 메모리: 사용 가능한 메모리 양을 나타내며, 유저 프로세스가 사용할 수 있는 메모리의 추정치입니다. 이는 free, buff/cache에서 시스템 예약 메모리를 빼서 계산됩니다. 따라서 free 메모리가 많더라도, 실제 사용 가능한 메모리는 더 적을 수 있습니다.

 

 

4번문제 Buffered I/O

Direct I/O vs Buffered I/O

  • Direct I/O : CPU가 DISK 로 바로 때리는 방식
  • Buffered I/O : CPU가 DRAM 을 거치고 DISK 를 가는 방식 ( DRAM에 자주 access 하는 게 메모리에 남겨져 있어서 buffered 가 direct보다 빠르다

 

Buffered I/O: 파일 입출력을 할 때, 데이터를 직접 디스크에 쓰지 않고 메모리에 버퍼를 사용하여 효율적으로 처리합니다. 이 과정에서 페이지 캐시를 활용하여 성능을 향상시킵니다.

 

5번문제 시스템 이벤트 두가지

  • 인터럽트: 하드웨어나 소프트웨어가 CPU의 작업을 중단하고 이벤트를 처리하도록 하는 신호입니다.
    • 타이머 인터럽트: 주기적으로 발생하여 프로세스 스케줄링 등을 수행합니다.
    • 네트워크 인터럽트: 네트워크 패킷 수신 시 발생합니다.
  • 예외: 특정 이벤트가 발생했을 때 처리하는 메커니즘입니다.
    • 시스템 호출 (syscall): 사용자 공간에서 커널 공간으로 요청을 전달하는 방법입니다.
    • 페이지 폴트 (page fault): 요청된 페이지가 메모리에 존재하지 않을 때 발생하며, 페이지를 메모리에 로드하는 과정이 필요합니다.

 

 


 

 

네트워크 한번에 이해하자

 

응용프로그램

L7 : URL

 

—-

전송

L4 : port, TCP(연결형)/UDP(비연결형) (세그먼트) 헤더 크기 20byte

전송오류, 긍정응답,부정응답프레임, 프레임분실 -> 순서 번호, 흐름제어(상대방한테 데이터를 줄때 상대방이 받는 응답의 속도에 맞춰서 흐름 제어를 한다. (슬라이딩 윈도우 프로토콜))

 

슬라이딩 윈도우 프로토콜

윈도우 크기: 송신자가 한 번에 전송할 수 있는 데이터의 양을

윈도우 하단 값 : 현재 수신자가 수신할 수 있는 데이터의 시작 지점

 

수신자가 윈도우 하단 값을 조정하는 이유:

수신자는 자신의 버퍼 크기 및 처리 능력에 따라 윈도우 하단 값을 조정합니다. 만약 수신자의 버퍼가 가득 차면, 수신자는 송신자에게 더 이상 데이터를 보내지 못하도록 하여 데이터 손실을 방지합니다.

 

TLS(전송 계층 보안, Transport Layer Security)는 인터넷에서 데이터의 안전한 전송을 보장하기 위해 설계된 암호화 프로토콜

 

포트 숫자가 1024 보다 작으면 모두 Well-known 포트

 

UDP(비연결형) - 신뢰성이 의미가 없을때 빨리 하기 위해서 사용

 

3way handshake(전송계층에서 일어남) -> SYN Flooding 공격 (SYN만 마구잡이로 보냄 서버의 리소스가 과도하게 소모되어 정상 트래픽의 처리를 어렵게함)

 

—-

네트워크 (패킷) 헤더 크기 20byte

L3 : IP / BGP Hijacking - 네트워크 경로를 악의적으로 변경하여 트래픽을 가로채는 공격

패킷의 최대사이즈는 1500

 

1기가 / 1500byte (패킷의 최대 사이즈)

하지만 헤더 20을 빼면 1480 만 한번에 전송될 수 있다

 

물리, 데이터링크 (이더넷 =( LAN = MAC = 1,2 계층 = 물리적), 프레임, 헤더 크기는 14byte

L1,2 : MAC / ARP spoofing - 네트워크에서 ARP를 조작하여 데이터 전송을 가로채는 방식

 

—-

Smurf 공격 : 브로드캐스트 응답받을 IP 주소를 변조하여 공격대상자 IP 주소에 보내게 만들어 Dos공격을 하는 기법

BGP : AS(자율 시스템) 간에 라우팅 정보를 교환하는 프로토콜

BGP Hijacking : 네트워크 경로를 악의적으로 변경하여 트래픽을 가로채는 공격

ROP (Return Oriented Programming) 공격: 악의적인 코드를 직접 삽입하는 대신, 기존의 실행 가능한 코드 조각(“gadget”)을 사용하여 원하는 동작을 수행 - 버퍼오버플로우 취약점 이용

 

Dangling pointer: 해제된 영역의 포인터를 가리키고 있는 포인터

 

Seccomp: 프로세스가 사용할 수 있는 시스템 콜을 제한하는 샌드박스 보안 기능

 

 

비트 계산법

16진수는 2^4이기때문에 = 4비트이다.

‘영’ 4비트 ‘팔’4비트 ‘영’4비트 ‘영’4비트

8비트+ 8비트 = 2바이트

 

300x250
320x100

리눅스 전반적인 운영체제 복습

 

리눅스 역할 2가지

  • App관리, HW관리(cpu, ram, disk, net)

리눅스 실체 → c코드 → 10만개 / proc/kallsyms → 300~400개 → 시스템콜(open, read, write) 컴파일해서 결과물은 vmlinux(가상메모리 메커니즘을 지원)으로 나온다. 

가상메모리 메커니즘의 배경이 될 수 있는 ABI (application binary interface) 바이너리를 만들때 규약, 규칙을 만드는데 OS,CPU,컴파일러가 규칙을 만들어서 ELF, syscall number(함수호출규약- 여러가지 레지스터를 어떻게 사용할건지), calling convension, 가상메모리 매커니즘

  • 컴파일러
  1. PA 기반 컴파일러 입장에서는 물리주소로 컴파일하면 실행이 한정적이다.
  2. VA 기반 컴파일하면 어디서든 실행이 된다. 

실행하게 되면 OS가 프로세스를 실행하면서 자료구조 task_stuct 를 만들고 거기 딸려있는

  1. mm_struct(text, heap, stack vma 를 만듬) - 이런 것들을 확인할 수 있는 방법 /proc/[PID]/maps (가상주소 기록만 함) 를 통해서 확인가능
  2. VA-PA매핑, 변환테이블(페이지 테이블)이고 기본적으로 깡통으로 둬서 후매핑 방식으로 사용 - ps -eo pid,comm,vsz,rss | head -2 를 통해서 확인가능

OS준비하고 CPU가 VA 를 통해 CPU 내부에 있는 MMU에게 준다 이것은 현재 페이지테이블을 찾아서 VA-PA 변환시도를 한다.  변환실패하면 MMU 를 통해 pagefault 를 통해 예외처리로 페이지 폴트 핸들링을 한다.

 

페이지 폴트 핸들링

  • 페이지폴드 핸들링(VA검사를 통해 유효한지 mm_struct 사용해서 확인하고 유효하지 않다고 판단되면 segfault
  • 유효하다고 판단되면 페이지(4KB, 0x1000, 12bit, 2^12, 4096) 한조각 할당
  • huge page 설정이 되어있다면 512개를 한번에 할당할 수 있다. // VA-PA 매핑 기록을 페이지 테이블에 기록한다.

결론적으로 컴파일러는전세계있는 PA를 모르기떄문에 VA 기반으로 한번 컴파일하면 알아서 변환해서 써라고 OS, CPU 에게 던져주는 구조이다.

던져주면 OS 는 mm_struct, page table을 준비하고 CPU는 MMU를 통해서 변환을 제어하고, 변환에 대한 이벤트가 발생하면 OS 수습 → CPU

 

 

구성

core

  1. PM 프로세스 관리 → task_struct 를 사용한다 CFS 스케쥴러(virtual run time 이라고해서 최소값을 선택하는 방식
  2. MM 메모리관리 → mm_struct(vma, vma, vma … / 페이지 테이블(VA-PA) / 시스템 이벤트 핸들러 : 인터럽트: 네트워크, USB, 타이머 // 예외처리 : syscall , pagefault 부팅한 이후에는 숨쉬듯 계속 발생해서 예외처리를 해야함

결국 이벤트핸들러는 우렁각시 같은 것이고 주인공은 nginx, mysql 같은게 주인공이다. 그래서 메모리를 계속 물고 있으면 안된다 → 그래서 탄생한게 TH( top half : 전반부), BH (bottom half: 후반부 작업(나중에 호출해도 되는 커널, 함수 미루기 - 대표적으로 workqueue(다양하게 계층적으로 처리 (kworker), softirq (8개의 함수밖에 못미뤄서 유연성 떨어짐 - ksoftirqd), tasklet(유연성은 있지만 큐가 2개밖에 없음) )

I/O

  1. 네트워크
    • L4 TCP
    • L3: IP,netfilter(iptables 명령어를 제어하고, 블랙리스트, 화이트리스트, 디도스 공격 등을 제어가능 아이피 대역에 대한 관리)
    • L2:MAC
  2. 디스크 (VFS, FS, Block FS) //
    • 파일시스템: 디스크 블록을 어떻게 read/write할지 전략, 규칙을 세우는 것 (대표적으로 ext4, xfs, f2fs, btrfs)
  3. 디바이스 드라이버

기타 : 도구, 사운드, 보안

 


 

traceroute www.google.com

아이피가 두개가 적혀져 있는 이유는 혹시 모를 상황을 대비하는 것

 

traceroute는 ICMP로 동작한다. → ICMP 를 응답하지 않는 것들은 응답을 받지 못할 수 있다.

웹서버는 TCP 사용하기 떄문에 www.naver.com 같은 일반 사이트는 응답받지 못한다. 하지만 google은 예외.

보통 웹서버는 ICMP 를 안받기 떄문에 정상적으로 안된다.

웹서버(nginx, httpd) ↔ 웹 어플리케이션 서버(WAS) ↔ DB(mysql, postgresql …)

C코드 → HTTP 통신은 기능이 많다 예를들어 결제, 로그인 정보조회기능 등 보통java(spring), python(django), js(nodejs, next.js) 등을 사용한다. 프레임워크는 미리 짜놓은 코드

캐시(HTML, 이미지…)

 

(1) 포트번호 살아 있는지 확인하기

  • sudo netstat -tplan | grep 3000

(2) nginx 상태확인

  • sudo service nginx status

(3) nginx 설정적용

  • sudo service nginx reload

(4) nginx 재시작

  • sudo service nginx stop && sudo service nginx start

 

  1. GitHub 오픈소스 spring 프로젝트 소스 다운
  2. java 소스 → 빌드 → jar → java~~.jar → 스프링 → 내장 tomcat → WAS 실행
  3. 8080 포트 확인
  4. 웹서버 테스트 확인
  5. 나의실습환경 → 웹서버 테스트 확인

리눅스 서버 1대 ←—- 여러개의 터미널로 접속가능하다.

터미널을 끄면 java 서버가 꺼지는데 터미널을계속 켜놔야하는가?

  • 우리가 java 실습한 건 테스트서버로 실행
  • 배포할때는 service 활용, daemon 프로세스
  • nohup → 백그라운드

프로세스 강제종료

kill -9 (number)

 

 

Node.js 설치와 웹 애플리케이션 테스트

 


성능부하테스트

 

sudo dnf install -y bmon / httpd-tools / hping3 / iftop

터미널 1 : bmon 모니터링

터미널 2 성능부하테스트 : ab -n 1000 -c 100 http://localhost/

 

loadavg → 시스템 부하가 어느정도

1분, 5분, 15분 → 평균 → 코어의 개수 → nproc

R / D(Disk sleep = Disk I/O 처리가 늦어지고 있다는 말) 상태의 프로세스가 많을때

wa 가 높아지는경우 → I/O 기다리는 시간이 길어진다.

 

  • used : heap, stack 처럼 순수메모리 사용량 (Anonymous)
  • free : 미사용공간
  • buff/cache : 디스크 블록을 임시적으로 저장해두는용도 (Pagecache 용도)

 

buff/cache 비우기

  • echo 3 › /proc/sys/vm/drop_caches

drop_caches 를 했는데 왜 buff/cache 가 남아있는가? -> 현재 돌아가고 있는 프로세스들이 있다. 아래의 명령어를 통해 실행중인 프로세스 확인 가능

ps -ef | wc -l

 

  1. Buffered I/O: 파일 입출력을 할 때, 데이터를 직접 디스크에 쓰지 않고 메모리에 버퍼를 사용하여 효율적으로 처리합니다. 이 과정에서 페이지 캐시를 활용하여 성능을 향상시킵니다.
  2. Dirty 페이지: 메모리에서 수정된 데이터(Dirty 페이지)는 디스크와 동기화되지 않은 상태입니다. 이러한 페이지는 주기적으로 디스크에 기록되며, 이 과정을 "writeback"이라고 합니다. 기본적으로 5초마다 수행됩니다.
  3. Available 메모리: 사용 가능한 메모리 양을 나타내며, 유저 프로세스가 사용할 수 있는 메모리의 추정치입니다. 이는 free, buff/cache에서 시스템 예약 메모리를 빼서 계산됩니다. 따라서 free 메모리가 많더라도, 실제 사용 가능한 메모리는 더 적을 수 있습니다.
  4. 메모리 관리: 시스템의 메모리 상태를 지속적으로 모니터링하고 관리하는 것이 중요합니다. available 수치가 낮으면 성능 저하를 초래할 수 있으므로, 필요 시 프로세스를 종료하거나, 메모리 사용을 최적화하는 방안을 고려해야 합니다.

 

Direct I/O vs Buffered I/O

  • Direct I/O : CPU가 DISK 로 바로 때리는 방식
  • Buffered I/O : CPU가 DRAM 을 거치고 DISK 를 가는 방식 ( DRAM에 자주 access 하는 게 메모리에 남겨져 있어서 buffered 가 direct보다 빠르다.

 

네트워크 패킷 전송 과정:

목적지 IP 주소 필요 → 나의 IP 주소192.168.0.12 , 서브넷마스크를 통해 외부망 안에 포함되는지 내부망에 포함되는지 확인을 한다.

  1. 192.168.0.15 내부망일 경우 → ARP 브로드캐스트 → ARP 통해서 whohas 192.168.0.15 를 누가 가지고 있는지에 대한 패킷을 뿌림 → ARP → 192.168.0.15의 MAC 주소를 획득 → ARP 테이블에 저장
  2. 8.8.8.8 → 외부망인걸 확인 → ARP 브로드캐스트 → ARP 누가 게이트웨이인지에 대한 내용의 패킷을 뿌림 → ARP → 게이트웨이의 MAC 주소를 획득한다.

 

ICMP L3(네트워크 계층) 통신

 

DNS

 

 

TCP

4 way handshake

HTTP GET 요청(패킷 1개) / 응답(패킷 1개) 라면

총 몇개의 패킷을 주고 받은걸까

3개(3way hand) + 2개(connection) + 4개 (4way hand) = 9개

 

 

ARP broadcast

 

ping 10.0.2.17 (목적지 아이피주소)

나의 IP 주소 10.0.2.15

목적지 IP 주소 10.0.2.17

출발지 MAC주소는 (나의 MAC주소)

내부망에 있는 10.0.2.17 에게 ICMP 패킷을 전송한다는 말

패킷전송을 하려면 목적지 MAC 주소가 필요하다. → 어떻게 알아내냐면 ARP 브로드캐스트 를뿌려서 알아낸다. (누가 10.0.2.17을 가지고 있어? whohas)

300x250
320x100

리눅스의 주요 역할

  1. 응용 프로그램 관리 (App Management)
    • 리눅스는 다양한 응용 프로그램을 실행하고 관리하는 역할을 합니다. 프로세스의 생성, 스케줄링, 종료 등을 통해 여러 응용 프로그램이 효율적으로 자원을 사용할 수 있도록 합니다.
  2. 하드웨어 관리 (Hardware Management)
    • CPU, RAM, 디스크, 네트워크 장치 등 하드웨어 리소스를 관리합니다. 이를 통해 시스템 자원의 효율적인 사용과 안정성을 보장합니다.

리눅스의 물리적 실체

  • 리눅스 커널은 C 코드로 작성되어 있으며, 컴파일을 통해 vmlinux라는 실행 파일로 변환됩니다. 이 커널은 약 10만 개의 함수로 구성되어 있으며, 그 중 300~400개는 사용자 호출이 가능한 시스템 콜로 제공됩니다. 예를 들어, open, read, write 등의 시스템 콜이 있습니다.

바이너리 실행 파일 및 ABI

  • 리눅스에서 실행되는 바이너리 파일은 ELF(Executable and Linkable Format) 형식을 따릅니다. ABI(Application Binary Interface)는 운영체제, CPU, 컴파일러 간의 규칙과 규약을 정의합니다. ABI를 준수하면, 소스 코드를 한 번만 컴파일하더라도 여러 시스템에서 재컴파일 없이 실행할 수 있습니다.

.

ABI는 소프트웨어와 하드웨어 간의 상호작용을 정의하는 중요한 규칙 세트로, ELF 파일 형식, 시스템 호출 번호, 호출 규약, 가상 메모리 매커니즘 등을 포함하여 다양한 컴포넌트를 통해 운영체제와 응용 프로그램 간의 호환성을 보장합니다. 이를 통해 개발자는 다양한 환경에서 소프트웨어를 효과적으로 개발하고 배포할 수 있습니다.

메모리 관리

  • 소스 코드는 물리적 메모리 주소 기반으로 컴파일되지만, 실제 실행 시에는 가상 주소(VA)가 사용됩니다. 이때, OS와 CPU는 VA를 물리적 주소(PA)로 변환하여 메모리를 관리합니다.
  • OS는 프로세스를 실행할 때 task_struct와 mm_struct를 사용하여 각 프로세스의 가상 주소 공간을 기록합니다. 이 구조체는 가상 메모리 영역(VMA)을 관리합니다.

페이지 테이블 및 MMU

  • CPU 내부의 MMU(Memory Management Unit)는 가상 주소를 물리적 주소로 변환하는 역할을 합니다. 만약 현재 프로세스의 페이지 테이블에 해당 VA가 존재하지 않는 경우, 페이지 폴트(page fault) 예외가 발생합니다. 이는 필요한 페이지를 메모리에서 로드하거나, 다른 처리를 통해 해결해야 함을 의미합니다.
  • 리눅스는 후매핑 방식을 사용하여 필요한 페이지가 실제로 사용될 때까지 물리 메모리에 로드하지 않습니다. 즉, 프로세스가 특정 메모리 페이지에 접근하려 할 때, 해당 페이지가 메모리에 존재하지 않으면 페이지 폴트가 발생합니다.

pagefault는 프로세스가 접근하려는 가상 주소가 물리 메모리에 존재하지 않을 때 발생합니다. 이 경우, OS는 해당 VA가 유효하지 않음을 확인하고 페이지를 디스크에서 로드하여 페이지 테이블을 업데이트합니다. 페이지 크기는 일반적으로 4KB이며, 페이지 테이블은 VA와 PA 간의 연결을 관리하여 메모리 접근을 효율적으로 수행합니다. 이 모든 과정은 가상 메모리 시스템의 핵심적인 부분으로, 프로세스가 메모리를 안전하고 효율적으로 사용할 수 있도록 돕습니다.

*페이지 크기: 4KB,4096,0x1000, 12bit, 2^12

 

 

1. CPU와 MMU의 상호작용

  • CPU는 실행 중인 프로그램의 명령어를 처리하며, 메모리에 접근할 때 가상 주소(VA)를 사용합니다.
  • **MMU (Memory Management Unit)**는 CPU가 요청한 가상 주소를 물리 주소(PA)로 변환하는 역할을 합니다. MMU는 페이지 테이블을 참조하여 VA의 유효성을 검사하고, 해당하는 PA를 획득합니다.

2. 메모리 접근 과정

  • CPU가 메모리에 접근할 때, 다음 과정이 일어납니다:
    1. CPU가 MMU에 가상 주소를 전달합니다.
    2. MMU는 페이지 테이블을 조회하여 VA에 해당하는 PA를 찾습니다.
    3. PA가 결정되면, MMU는 이 주소를 CPU에 반환합니다.

3. 캐시 계층

  • PA가 획득되면, 다음 단계는 캐시 메모리입니다:
    1. 캐시 컨트롤러는 PA를 기반으로 캐시 메모리(SRAM L1, L2, L3)에 접근합니다.
    2. 만약 요청한 데이터가 캐시에 없다면, "cache miss"가 발생합니다.
    3. 이 경우, **메모리 컨트롤러(MC)**는 DRAM에서 데이터를 가져와야 합니다.

4. Huge Page

  • Huge Page는 메모리 관리에서 더 큰 페이지 크기를 사용하는 방식입니다. 예를 들어, 4KB 페이지를 512개 사용하여 2MB의 메모리를 할당할 수 있습니다. Huge Page는 페이지 테이블의 크기를 줄이고 TLB(Translation Lookaside Buffer)의 효율성을 높여 성능을 개선합니다.

5. 프로세스 및 쓰레드 구조

  • 프로세스가 생성될 때, test_struct와 같은 구조체가 만들어집니다. 이 구조체는 프로세스의 정보와 상태를 담고 있습니다.
  • 각 쓰레드는 task_struct를 사용하여 관리됩니다. 이 구조체는 쓰레드의 실행 정보 및 상태를 포함합니다.
  • 하지만 여러 쓰레드가 동일한 프로세스 내에서 실행될 때, 메모리 관리 구조체인 mm_struct를 공유합니다. 이는 모든 쓰레드가 동일한 가상 메모리 공간을 사용하게 함으로써 효율적인 메모리 관리를 가능하게 합니다.

*쓰레드(Thread)는 프로세스 내에서 실행되는 가장 작은 단위로, 프로세스가 수행하는 작업의 흐름을 나타냅니다. 쓰레드는 프로세스의 자원을 공유하며 독립적으로 실행될 수 있습니다. 여러 쓰레드가 동시에 실행됨으로써 멀티태스킹을 구현할 수 있으며, 이를 통해 프로그램의 성능을 향상시킬 수 있습니다.

 

 

  1.  

1. 프로세스 관리 (PM)

  • 프로세스 관리는 운영체제가 프로세스의 생성, 스케줄링, 종료 등을 관리하는 기능입니다.
  • task_struct: 각 프로세스에 대한 정보를 담고 있는 구조체로, 프로세스 ID, 상태, 우선순위, 스케줄링 정보 등을 포함합니다.
  • CFS (Completely Fair Scheduler): Linux의 기본 스케줄러로, 프로세스의 CPU 시간을 공정하게 분배하는 알고리즘입니다. 각 프로세스의 가상 실행 시간을 기반으로 스케줄링을 수행합니다.

2. 메모리 관리 (MM)

  • 가상 메모리 관리: 프로세스가 사용하는 가상 주소 공간을 관리합니다. mm_struct는 가상 메모리 영역(VMA)을 정의하며, 여기에는 스택, 힙, 텍스트 영역이 포함됩니다.
    • Stack VMA: 함수 호출 시 사용하는 스택 메모리 영역.
    • Heap VMA: 동적 메모리 할당을 위한 힙 메모리 영역.
    • Text VMA: 실행 코드가 위치하는 영역.
  • VA-PA 매핑 테이블: 가상 주소를 물리 주소로 변환하기 위한 페이지 테이블을 포함합니다.
  • 물리 메모리 관리:
    • 버디 시스템: 메모리 할당을 효율적으로 관리하는 방법으로, 메모리를 2의 거듭제곱 크기로 분할하여 관리합니다.
    • 페이지 조각 관리: 4KB 크기의 페이지를 기본 단위로 하여 메모리를 관리합니다.

3. 시스템 이벤트

  • 인터럽트: 하드웨어나 소프트웨어가 CPU의 작업을 중단하고 이벤트를 처리하도록 하는 신호입니다.
    • 타이머 인터럽트: 주기적으로 발생하여 프로세스 스케줄링 등을 수행합니다.
    • 네트워크 인터럽트: 네트워크 패킷 수신 시 발생합니다.
  • 예외: 특정 이벤트가 발생했을 때 처리하는 메커니즘입니다.
    • 시스템 호출 (syscall): 사용자 공간에서 커널 공간으로 요청을 전달하는 방법입니다.
    • 페이지 폴트 (page fault): 요청된 페이지가 메모리에 존재하지 않을 때 발생하며, 페이지를 메모리에 로드하는 과정이 필요합니다.

4. I/O 관리

  • 네트워크:
    • L4 (TCP): 전송 계층 프로토콜로 데이터 전송을 담당합니다.
    • L3 (IP): 네트워크 계층 프로토콜로 패킷의 라우팅을 담당합니다.
    • Netfilter (iptables): 패킷 필터링 및 네트워크 주소 변환(NAT)을 위한 프레임워크입니다.
    • L2 (MAC): 데이터 링크 계층에서의 주소 지정 및 프레임 전송을 관리합니다.
  • 디스크:
    • VFS (Virtual File System): 다양한 파일 시스템을 추상화하여 일관된 인터페이스를 제공하는 계층입니다.
    • FS (File System): 파일 시스템의 구현으로, submit bio를 통해 블록 장치에 대한 읽기/쓰기 요청을 처리합니다.
    • 블록 파일 시스템: 물리 디스크 블록을 읽고 쓸 방식을 정의합니다. 예: ext4, xfs, btrfs, f2fs 등.
  • 디바이스 드라이버:
    • 다양한 하드웨어 장치를 운영체제가 사용할 수 있도록 해주는 소프트웨어입니다. 예를 들어, 네트워크 카드, 블루투스 장치, PCI-e 장치 등이 있습니다.

기타: 보안, 도구, 사운드


권한 확인

getfacl hello.txt

 

 

소유자에게는 읽기, 쓰기(6) 권한을 주고, 그룹과 기타 사용자에게는 읽기(4) 권한만 부여

chmod 644 hello.txt

 

 

chmod g-r hello.txt

그룹(g) 권한의 읽기(r) 권한을 제거(-)

 

 

/usr/bin 폴더안에 있는 파일들이 진짜 바이너리파일들만 있을까?

/usr/bin 폴더안에 있는 파일들 중에서 스크립트 파일만 추려내려면?

 

  • LIST=$(ls /usr/bin)
  • echo $LIST
  • for name in $LIST
  • do
  • file $name
  • done
  • for name in $LIST; do file $name; done | grep -v ELF

제시하신 명령어는 LIST 변수에 저장된 파일 목록을 순회하면서 각 파일의 타입을 file 명령어로 확인하고, 그 결과 중에서 ELF 파일을 제외하는 작업을 수행합니다.

  • echo “hello” : 터미널 stdout 출력화면 print
  • cat hello.txt : 파일을 read 해서 stdout 출력
  • awk: column 추출
  • grep: 가로추출: 라인 by 라인 필터링
  • sort: 정렬 → 알파벳, 숫자(-n), KGM -h

패키지

아이폰 → 앱스토어 →앱설치, 삭제, 업데이트

리눅스

  • 패키지관리자 (apt, dnf, yum)을 통해 패키지 설치, 삭제, 업데이트를 할 수있다.
  • 오픈소스라서 자유도가 높다 (기업활용, 지속적발전)

패키지 관리자

  1. High-Level 패키지 관리자:
    • apt, yum, dnf는 고수준 패키지 관리 도구로, 사용자 친화적인 인터페이스를 제공하고, 패키지의 설치, 삭제, 업데이트 등을 쉽게 수행할 수 있도록 도와줍니다.
    • 이 도구들은 내부적으로 저수준 패키지 관리자(rpm, dpkg)를 호출하여 실제 패키지 파일을 처리합니다.
  2. Low-Level 패키지 관리자:
    • rpm(Red Hat Package Manager)과 dpkg(Debian Package)는 저수준 패키지 관리 도구로, 패키지 파일을 직접 설치하거나 관리합니다.
    • 이들은 패키지의 세부 정보를 직접 처리하며, 패키지 정보(이름, 버전 등)를 기반으로 패키지 리스트를 생성합니다.
  3. 패키지 파일:
    • .rpm  .deb 파일은 각각 Red Hat 계열과 Debian 계열의 패키지 형식으로, 윈도우의 설치 파일과 유사합니다.
    • 이 파일들은 패키지 설치 시 사용됩니다.

프로세스와 커널

  1. 프로세스 실행:
    • OS에서 실행 중인 프로세스의 수를 확인하려면 다음 명령어를 사용할 수 있습니다:

      bash

      ps -ef | wc -l
      
  2. 유저 프로세스 vs 커널 프로세스:
    • 유저 프로세스는 사용자 애플리케이션(예: Nginx, MySQL, Tomcat, PostgreSQL)으로, 실제로 사용자가 상호작용하는 프로그램입니다.
    • 커널 프로세스는 시스템 자원을 관리하고, 하드웨어와 상호작용하는 데 필요한 작업을 수행합니다.
  3. 커널 프로세스의 필요성:
    • 커널은 하드웨어와 소프트웨어 간의 인터페이스 역할을 하며, 시스템의 안정성과 보안을 보장합니다.
    • 커널 프로세스는 이벤트 핸들러와 같은 역할을 하여, 시스템 자원을 효율적으로 관리합니다.

인터럽트 처리

  1. 하드 인터럽트(Top-half):
    • 하드웨어 인터럽트가 발생했을 때 즉시 처리되는 부분으로, 빠른 응답이 필요한 작업입니다.
  2. 소프트 인터럽트(Bottom-half):
    • 하드 인터럽트가 발생한 후, 이후에 처리해도 되는 작업을 지연시켜 처리하는 부분입니다.
    • 주로 workqueue, softirq, tasklet을 통해 구현됩니다.

1. mm_struct

  • 목적: 각 프로세스에 대한 메모리 관리 정보를 저장합니다. 커널은 이 구조체를 통해 프로세스의 가상 메모리 공간을 관리합니다.
  • 구성 요소:
    • vma (Virtual Memory Area): 프로세스의 가상 메모리 영역을 나타내는 구조체의 리스트입니다. 각 vma는 특정 메모리 영역(예: 텍스트, 힙, 스택 등)에 대한 정보를 포함합니다.
    • 페이지 테이블: 가상 주소와 물리 주소 간의 매핑 정보를 저장하는 테이블입니다.
    • 메모리 관리 상태: 페이지 폴트 처리 및 메모리 할당 상태를 관리합니다.

2. vm_area_struct

  • 목적: 각 가상 메모리 영역에 대한 정보를 저장하는 자료구조로, 프로세스의 메모리 공간을 세부적으로 관리합니다.
  • 구성 요소:
    • 시작 주소와 끝 주소: 해당 영역의 가상 메모리 주소 범위를 지정합니다.
    • 메모리 접근 권한: 읽기, 쓰기, 실행 권한을 설정합니다.
    • 백킹 저장소: 해당 영역에 대한 데이터가 어떻게 저장되는지를 나타냅니다(예: 파일 매핑, 익명 메모리 등).

메모리 관리 및 페이지 설정

  • 페이지 테이블: 가상 주소(VA)와 물리 주소(PA) 간의 매핑을 관리합니다. 페이지 테이블은 일반적으로 4KB 크기의 페이지 단위로 할당되며, 이로 인해 메모리 사용의 효율성을 높입니다.
  • Huge Page: 큰 페이지를 사용하여 메모리 할당의 오버헤드를 줄입니다. 예를 들어, 2MB 또는 1GB의 큰 페이지를 사용하면, 많은 수의 작은 페이지를 관리하는 것보다 효율적입니다.

메모리 할당과 해제

  • malloc 및 free: 메모리 할당 요청(malloc)이 발생하면 mm_struct에 해당 정보를 기록합니다. 해제 요청(free)이 없으면, 가상 메모리 사용량(vsz)은 계속 증가하게 됩니다.
  • 가상 주소와 물리 주소 연결: 현재는 가상 메모리 주소이지만, VA-PA 연결이 이루어진 후에는 실제로 존재하는 가상 주소로 변환되어 사용됩니다.
  • dnf 란 ? “Dandified YUM” yum (Yellowdog Updater, Modified)의 후속 버전으로, 더 향상된 의존성 해결 알고리즘과 성능 최적화를 제공하고 자동화된 문제 해결기능, 유저 친화적인 기능 등으로 발전된 소프트웨어 패키지 관리자 이다.

패키지 관리 및 의존성

  1. 패키지 저장소 서버 URL 설정
    • 패키지 저장소의 URL은 /etc/ 디렉토리에 설정됩니다. 이곳에서 패키지 관리 도구가 사용할 저장소의 위치를 지정합니다.
  2. 패키지 정보 및 파일
    • 패키지 정보와 관련된 파일은 /var/cache 디렉토리에 저장됩니다. 이곳은 패키지 관리 도구가 다운로드한 패키지 파일의 캐시를 보관하는 위치입니다.
  3. 캐시
    • 캐시는 미리 읽어놓은 데이터로, 패키지 관리 도구가 더 빠르게 작업을 수행할 수 있도록 도와줍니다.
  4. 의존성 패키지
    • apt, yum, dnf와 같은 패키지 관리 도구는 소프트웨어 설치 시 필요한 의존성 패키지를 자동으로 관리합니다.
  5. 패키지 삭제 시 의존성 관리
    • 예를 들어, httpd 패키지를 삭제할 경우, 해당 패키지에 의존하는 C, D 패키지는 자동으로 삭제되지 않습니다. 이는 의존성 패키지가 다른 소프트웨어에서 사용될 수 있기 때문입니다.
    • 그러나 apt autoremove 명령어를 사용하면 더 이상 사용되지 않는 의존성 패키지를 정리할 수 있습니다. 이 명령은 시스템에서 필요 없는 패키지를 자동으로 찾아 삭제합니다.
  6. 패키지 설치 예시
    • nginx 설치 시 A, B, C, D 의존성 패키지가 설치됩니다.
    • nodejs 설치 시 C, D 의존성 패키지가 설치됩니다.
    • httpd 설치 시 F, G, C, D 의존성 패키지가 설치됩니다.

내가 설치한것중에 mariadb 관련 뭐가 있지?

패키지정보(이름, 버전)만 가져오는 것 : yum check-update / apt update

패키지 버전 업그레이드 : yum update / apt upgrade

→ 백그라운드 업그레이드가 진행될 수 있다.

ls /boot

grep -v “#”

**`lsb_release -a` 명령어는 리눅스 시스템에서 설치된 배포판의 버전 정보를 출력하는 데 사용됩니다.**

패키지 저장소 서버 URL 설정파일

  • /etc/apt/sources.list
  • /etc/yum.repo.d/*.repo

패키지 정보(이름, 버전), 파일(.rpm, .deb)

  • /var/cache /yum

APT 패키지 관리 시스템

  1. APT 내부 구성
    • apt는 apt-get과 apt-cache를 내부적으로 사용하여 패키지를 관리합니다. apt-get은 패키지 설치, 제거 등의 작업을 수행하며, apt-cache는 패키지 정보 조회를 담당합니다.
  2. 패키지 정보 저장
    • 패키지 정보는 /var/lib/apt/lists/ 디렉토리에 저장됩니다. 이 폴더가 비어 있으면 현재 리눅스 시스템에서 패키지 정보(이름, 버전)가 없으므로 apt search 명령어를 사용할 수 없습니다.
    • 그러나 이미 설치된 패키지에 대한 정보는 여전히 존재하므로, 설치된 패키지에 대한 정보는 조회할 수 있습니다.
  3. 패키지 저장소와 정보
    • 패키지 정보는 패키지 저장소(repo) 서버로부터 수집됩니다. 이 정보에는 패키지의 이름, 버전 등이 포함됩니다.
  4. 패키지 조회 과정
    • 사용자가 apt search 명령어를 입력하면, APT는 저장소에서 패키지 정보를 조회하여 사용자가 요청한 패키지를 검색합니다.
  5. 패키지 파일 다운로드
    • 패키지 파일(.deb)은 임시로 /var/cache/apt/archives/에 다운로드됩니다.
    • 이 위치에 저장된 .deb 파일은 설치가 완료된 후 dpkg를 통해 처리됩니다.
  6. 패키지 설치 후 처리
    • 패키지가 성공적으로 설치되면, APT는 /var/cache/apt/archives/에 저장된 .deb 파일들을 제거하여 공간을 절약합니다.

정리

패키지 설치 실패 원인

  1. 외부망 및 DNS 설정 문제
    • 외부망 연결 문제: 폐쇄망 환경에서 외부망에 연결되지 않으면 패키지 공식 서버로부터 데이터를 다운로드할 수 없습니다.
    • DNS 설정 문제: DNS 설정이 잘못되면 도메인 이름을 IP 주소로 변환할 수 없어 패키지 저장소에 접근하지 못합니다. 예를 들어, ping 8.8.8.8은 성공하지만 ping www.google.com이 실패하는 경우 DNS 설정이 잘못된 것입니다.
  2. 패키지 저장소 URL 설정 문제
    • 패키지 저장소의 URL 설정에 문제가 있을 수 있습니다. URL이 만료되었거나 수정된 경우에도 패키지 정보를 가져올 수 없습니다.
    • 패키지 저장소의 설정 파일은 /etc/apt/sources.list (APT) 또는 /etc/yum/repo.d/*.repo (YUM)에서 확인할 수 있습니다.
  3. 패키지 정보 저장 경로
    • 패키지 정보는 패키지 저장소 서버로부터 가져와 /var/cache 또는 /var/lib/lists에 저장됩니다. 이 정보가 없으면 패키지 조회 및 다운로드가 불가능합니다.
  4. 패키지 조회 및 다운로드 과정
    • 패키지 조회(apt search 또는 yum search)를 통해 패키지 정보를 확인합니다. 이 과정에서 문제가 발생하면 패키지를 찾을 수 없습니다.
    • 패키지 파일은 .rpm (YUM) 또는 .deb (APT) 형식으로 다운로드됩니다.
  5. 패키지 설치 과정
    • 다운로드된 패키지 파일은 rpm 또는 dpkg를 통해 설치됩니다. 이 과정에서 오류가 발생할 수 있으며, 패키지 설치 후 임시로 저장된 패키지 파일들은 기본적으로 삭제됩니다.

 

리눅스 문제해결 접근방법과 전략

 

에러 메시지 처리 및 문제 해결 프로세스

  1. 에러 메시지
    • 예시: No such file or directory
    • 이 메시지는 시스템이 요청한 파일이나 디렉토리를 찾을 수 없음을 의미합니다.
  2. 문제 정의
    • 문제는 목표와 현재 상태 간의 차이(Gap)입니다. 예를 들어, 특정 파일에 접근해야 하는데 그 파일이 없어서 작업이 중단되는 상황입니다.
  3. 원인 분석
    • 동작 과정이나 절차를 나열하고 관찰하여 문제의 근본 원인(root cause)을 찾습니다.
    • 예를 들어, 우분투 버전을 업그레이드한 후 리드 성능이 30% 느려졌다면, 다음과 같은 과정을 통해 진단할 수 있습니다:
      • 원래 리드 성능이 어떻게 이루어지는지 분석합니다.
      • 시스템 아키텍처를 고려하여 유저 → 커널(VFS → syscall → FS → submit_bio → Block) 경로를 추적합니다.
      • smartctl 등을 사용하여 디스크 상태를 점검합니다.
      • 펌웨어나 드라이버가 이전보다 성능이 떨어질 수 있으므로, 이를 확인하고 필요 시 펌웨어를 업그레이드해야 할 수 있습니다.
  4. 성능 관련 고려 사항
    • 유저가 10바이트를 리드 요청했더라도 디스크가 느릴 경우, 예상되는 블록을 미리 읽어오는 방식(read-ahead)이 적용될 수 있습니다.
    • 미리 읽기 사이즈가 크면 성능이 좋아질 수 있습니다. 예를 들어, 넷플릭스와 같은 영상 스트리밍 서비스에서는 큰 데이터 블록을 미리 읽어와 버퍼링을 줄이는 방법이 효과적입니다.
  5. 해결책 적용
    • 다양한 해결 방식을 적용하여 문제를 해결합니다.
    • 해결 과정에 대한 기록과 메모를 남기는 것이 중요합니다.
    • 적용한 해결 방식의 평가를 통해 임시방편적인지, 근본적인 해결 방법인지 분석합니다.
    • 예를 들어, 펌웨어 업데이트가 효과적이었다면, 이는 근본적인 해결책으로 평가할 수 있습니다. 반면, 임시 방편적인 조치일 경우 추가적인 조치가 필요할 수 있습니다.

리눅스 명령어 및 파일 관련 오류

쉘(sh, bash, zsh, …) → 명령어에 반응하는 프로그램

사용자 → 명령어를 입력 → bash → PATH 변수를 확인 → 여러개의 폴더 경로정보를 알 수 있다. → 폴더들을 전부 순회하면서 해당 명령어의 문자열이 일치하는 바이너리 실행파일을 찾는다. → 실행한다.

PATH=

PATH 경로 관련

주석을 바꾸면 file hello 에서 형식이 구분이 된다.

~/.bashrc 파일의마지막 라인에 PATH=$PATH:/home/realinux 를 추가하면 새롭게 열린 bash/shell 에서도 PATH 정보를 확인해서 home/realinux 를 찾을 수있다.

터미널생성 → bash 새롭게 ㅣㄹ행 → 최초실행시 ~/.bashrc 를 세팅한다.

기존 터미널에서 ~/.bashrc 를 수정했다면 source ~/.bashrc 명령어를 하면 새로운 터미널을 안켜도 현재 터미널에서 설정이 적용된다.

~/.bashrc 파일 마지막 라인에 아래 라인을 적고

alias test_ls=’ls -l —color=auto’

저장후에 source ~/.bashrc 설정 적용 하고 alias 명령어를 통해서 설정적용결과 확인하고 test_ls 명령어 입력해보기

아래의 명령어 맨 밑에 사진과 같이 입력을 하면 새로운 터미널을 켰을떄도 인석을 함

nano ~/.bashrc

alias grep=” 를 적고 저장후에

source ~/.bashrc 설정 적용하고

ps -ef | grep kwroker 가 정상동작 안되는 상황을 만들어보자

bash 쉘에서 명령어를 입력했을떄 처리되는 과정:

  1. alias 별칭인지?
  2. bash 쉘 내장명령어 인지? → compgen -b (내장명령어만 입력할 수 있다)
  3. bash 쉘이 아닌 외부명령어를 찾자 → PATH 변수를 참조해서 폴더를 순회하고 없으면 command not found 나옴
300x250
320x100

서버엔지니어(주로 리눅스.bash, python ⇒ 세팅,운영,문제해결,관리) vs 서버 개발자(주로 Java, Python 코딩)

리눅스에서 익혀야할 기초

  1. 기본 명령어 → 파일, 폴더, 편집, 다운로드, 설치 …
    1. 제어 명령어 → nginx, tomcat, mysql, postgresql, docker, …
    2. 조회 명령어 → 모니터링, 추적, 상태 확인
  2. 리눅스 구조 → cpu, ram, disk, net 관리 매커니즘
    1. 장기적으로 공부해야함 → 문제해결능력 기르는게 핵심
    2. Depth 단계별 학습해야함. 내 레벨은 1인데 레벨 10 지식은 혼란만 줌
  3. 리눅스 역할 → App 관리 / HW 관리(CPU, RAM, DISK, NET)
  4. 리눅스 란 ? → 시스템 이벤트 핸들러 이다!!
  5. mysql (유저) → 디스크 쓸거야!! → 어덯게 리눅스에게 요청 ?
    1. 시스템 콜(open, read, write)
  6. Core:
    1. PM : 프로세스 관리
    2. MM : 메모리 관리 → 가상메모리 매커니즘을 사용
    3. 시스템이벤트(인터럽트 예외) → 핸들링 !!
      1. Entry 진입점 : 커널함수가 호출되는 지점
  7. I/O :
    1. 네트워크 : L4 : TCP / L3 : IP / L2 : MAC
      1. nmap : 특정 서버를 조회하여 포트 등을 확인할 수 있음
    2. 디스크 : VFS(virtual file sys) / FS ⇒ submit_bio ⇒ Block
    3. 디바이스 드라이버
  8. 파일시스템 이란 ?
    1. 물리 디스크 블록을 어떻게 read/write할지 전략, 규칙
    2. ext4, xfs, btrfs, f2fs, …
    3. 디바이스 드라이버: 네트워크, PCI-e, 블루투스
  9. 기타 :
    1. 보안, 도구, 사운드 …
  10. 리눅스의 실체
    1. C코드 → 10만개 함수
    2. 300~400개 함수 → 유저호출가능 → 시스템콜함수(open, read, write)
    3. 컴파일결과 → vmlinux (virtual memory) → vmlinuz

GUI (Graphic User Interface)

  • 장점: 초보 유저가 사용하기 쉽다.
  • 단점: 느리다, 자원소모가 크다, 자동화가 불편하다(작업능률)

CLI (Command Line Interface)

  • 장점: 빠르다, 자원소모가 적다,자동화가 좋다(세부적이고 다양한 기능활용가능)
  • 단점: 명령어 숙지가 필요, 사용초기 진입장벽

리눅스 실습 기초 명령어

whatis cp 한줄로 명령이 뭔지 알래

man cp cp에 대해 알아보고 싶어

/r 내가 찾고 싶은 단어를 검색

n 스크롤 아래로

shift + n 스크롤 위로

파일의 메타정보 → inode 아이노드

물리 디스크 블록 → 슈퍼블록, 아이노드블록, 데이터블록

Access: 2024-08-22 04:26:35.685876192 +0000 (read 했을때) Modify: 2024-08-22 04:26:13.831633909 +0000 (내용이 변경되었을때) Change: 2024-08-22 04:26:46.810999529 +0000 (권한만 변경됌)

어떤 특정 실행파일이 어떤 라이브러리를 사용하는지 알아내는 명령어

ldd /bin/ls

stmbolic 링크를 사용하면 원본파일만 교체를 하면 편하다.

프로세스가 오픈 할 수 있는 파일의 개수

task_struct

→ fd [0] = stdin → tty →터미널,콘소리 입출력환경

[1]  = stdout → tty

[2] = stderr → tty

read(0,….) → scanf

write(1, …) → printf

write(2, …) → 에러메시지 출력시

2>/dev/null

find / -name "aaa” 입력

에러가 송출됌

find / -name "aaa" 2>/dev/null 입력

[2] = stderr → tty /dev/null (갈아끼워져서 에러가 생략)

그냥 묶기만 함 tar

압축함 - gz

/ 폴더가 최상위 폴더이고 run 폴더는 / 폴더의 자식폴더인데

자식폴더인 var 폴더나 usr 폴더는 /dev/vda1 디스크에 귀속되는데 왜 자식 폴더인 run은 ramdisk 에만 적용되는가?

캐시 : 미리 읽어 놓은 데이터 - 지워도 문제가없다

/usr → apt,dnf,yum 패키지 관리자 → 설치 기본경로

/etc → 설정파일

/run → 램디스크에 위치 → runtime 임시적으로 저장하는 파일 (mysql.sock, docker.sock)

No such file or directory : mysqld.sock → 껏다 키면 재생성됌

/mnt

/media → 새로운 디스크 장착(mount) 전용 폴더

/proc

/sys

/dev → 특수폴더이다 → 물리적으로 커널 메모리(변수,함수)에 장착된다.

VFS

/usr/bin 패키지관리자가 직접 관리 (배포판에 따라 달라질 수 있는 곳)

/usr/sbin

/usr/local → 소스코드 받아서 컴파일 해서 설치할때 쓰는 경로

/usr/local/sbin

/bin → 기초 명령어 ls, mv

/sbin

df -h / → disk 용량 확

ps -ef | wc -l 명령은 리눅스 또는 유닉스 시스템에서 현재 실행 중인 프로세스의 수를 계산

/usr/bin 폴더랑 /bin 폴더안에있는 모든 바이너리파일을 찾아서 ldd 명령어를 입력하면 설치된 모든 실행파일들이 사용하는 라이브러리 목록이 나온다. 중복되는걸 카운트해서 랭킹을 세우고 가장많이 쓰는 라이브러리 top 10을 찾을 수 있다.

root 계정에서 빠져나오기

sudo yum install -y vim

vim hello.txt

I —— insert

ESC —— 삽입 모드에서 나감

:q! —- 밖으로 나감

ctrl + z ——- stop

jobs —- 내가 한짓 확인

fg —— 다시 복구

내가 사용하고 있는 쉘

ps -ef | grep $$

“>” 덮어쓰기

“>>” 엎어 올리기

반복문으로 ls 불러오기

touch new.txt 임의의 텍스트파일 생성

locate new.txt (new.txt가 어디있는지 확인)

updatedb 를 해야 위치를 찾을 수 있다.

find ./ -name test.txt → find 명령어로는 바로 찾는다.

type d와 type f는 리눅스 또는 유닉스 시스템에서 파일 또는 디렉토리의 유형을 확인하는 명령어

대문자와 소문자 구분을 하기 때문에 구분안하고 모든 것을 뽑고 싶으면 -i 추가

-r = recursive

그냥 error 적는 것 보다 err 적으면 범위가 더 넓게 다 나옴

err = Errror + error

sudo yum install the_silver_searcher

cd /var/log

sudo ag err

ag err는 "The Silver Searcher"라는 텍스트 검색 도구를 사용하여 "err"라는 문자열을 포함하는 파일을 검색하는 명령입니다.

현재 리눅스에서 몇개의 프로세스가 구동중인지

ps -ef | wc -l

ps -ef: 현재 시스템에서 실행 중인 모든 프로세스를 나열합니다. -e: 모든 프로세스를 표시합니다. -f: 프로세스의 전체 형식을 보여줍니다.

ps -ef | head -5 —— 출력결과의 최상단부터 5라인을 필터링해 본다.

ps -ef | tail -5 —— 마지막 5라인 확인

 


터미널1 : sudo tail -f /var/log/yum.log

터미널2: sudo yum install -y httpd

이렇게 돌릴 경우 터미널1에서 이벤트가 나오는가 ?

터미널1 업데이트가 되는 것을 확인할 수 있음

 


ls -l / | awk -F " " '{print $2}’

세로줄 두번쨰칸을 뽑겠다.

root 가 구분자 역할을 해서 기준으로 3

sort — 문자열로 구분

sort -n (number) 숫자로 구분

sort -r (reverse) 거꾸로

du 를 통해서

human readable 하게


권한

읽기 (r: read)

쓰기(w: write)

실행(x: execute)

  1. 내 계정확인 whoami
  2. 파일의 권한 → owner 인 경우 / group / other 중 내가 어디에 속해 있는지 찾는다.

getfacl /var/log/messages

messages의 권한 설정을 확인하고 내 계정과 비교

sudo chmod o+r /var/log/messages

getfacl /var/log/messages

cat /var/log/messages

300x250
320x100

Pwntools

Pwntools는 파이썬으로 작성된 CTF(해킹 대회)와 익스플로잇 개발을 위한 도구 모음입니다. 이 라이브러리는 다양한 익스플로잇 작업을 쉽게 수행할 수 있도록 돕는 여러 기능을 제공합니다.

 

Stack 

스택은 거꾸로 자란다.

힙(Heap)은 컴퓨터 과학에서 동적 메모리 할당을 위한 데이터 구조 및 메모리 영역을 의미합니다.

buffer

 

기본 세팅 

 

 

Lucky draw 정적 분석 실습

Stack over flow

"Stack Overflow"는 일반적으로 프로그램이 스택 메모리를 초과하여 발생하는 오류입니다

 

  • $ wget {binary address}
  • # 바이너리에 실행 권한 부여
  • $ chmod +x lucky_draw
  • $ ./lucky_draw

IDA를 사용하여 lucky_draw 실행 후 바이너리 정적 분석

 

바이너리 파일을 실행시켜 문제가 어떻게 돌아가는지 점검을 해보니 문자를 넣을 수 있는 구간은 1번 add 기능과 3번 winner기능인 것으로 확인되었다.

IDA에서 add 함수부터 확인 시작

버퍼의 크기는 40 

read 크기는 0x860 (2144 size) 를 받는다

-> stack over flow 상황

 

1번 기능에 아무문자나 40개보다 많이  stack over flow 가 발생하는지 확인 -> 에러 발생

 

두번째 문자를 넣을 수 있는 곳 winner 기능 확인

버퍼의 크기는 24

read 크기는 0x98 를 받는다

-> stack over flow 상황

 

3번 기능에 아무문자나 24개보다 많이 넣어서 stack over flow 가 발생하는지 확인 -> 1번 기능과 동일하게 에러 발생

 

stack over flow 는 이런 상황에서 발생

 

 


 

Canary ( = 같은 기능을 수행 NX,malloc)

 

 

  • 스택 오버플로우 보호 완화 기법(mitigation)
  • 함수 호출 시 카나리 값을 스택 프레임의 최상단에 저장, 함수 종료 시 스택 오버플로우를 검사

 

Master Canary

  • 로컬 카나리는 함수 종료 시 검사를 위해 마스터 카나리와 비교 -> 값이 다르면 스택오버플로우가 발생했다고 판단하고 프로그램을 비정상 종료시킴 (stack smashing detected error 발생)
  • 일반적으로 마스터 카나리는 전역 공간에 저장되나 쓰레드에서는 마스터 카나리가 스택 영역에 저장

 

그렇다면 카나리를 우회하는 법이 있을까?

만약 카나리의 값과 마스터카나리값을 동일한 문자로 덮어버린다면 우회할 수 있다.

 

 

 

buffer size 0x28 보다 큰 임의의 값을 넣어준다 -> 0x100

 

 

앞에 p. 는 Pwntools로 분석을 쉽게 하기 위한 매크로를 만들고 있다고 생각하면 됌

sendlineafter설명

 

코드를 작성한 이후 테스트를 하고 싶으면 vscode와 연결되어 있는 터미널에

python3 {file name}  이런식으로 스크립트를 실행해주면 자동으로 넘어가서 테스트를 쉽게 할 수 있다.

버퍼오버플로우가 발생하고 카나리가 프로그램을 자동으로 종료시켜주는 것을 확인 할 수 있다.

 

로컬 카나리까지만 덮으면 전역카나리와 비교 후 값이 달라서 에러가 나는 것 확인

 

GDB를 통한 디버깅

  • tmux
  • python3 {file name} GDB

*GDB: 리눅스(C, C++. 바이너리) 디버거

 

break point 를 걸고 버퍼를 확인하는 작업을 GDB 에서 할 수 있다.

 

GDB에서 확인해야할 사항: 로컬 카나리 (stack frame 에 있는 것) ,마스터 카나리 (실제 원본 카나리)

 

x/gx $rbp-8 명령어를 통해서 로컬 카나리 확인이 가능하다.

 

stack frame point 에 rbp 가 위치하는데 그곳에서 8만큼 떨어진 위치에 로컬 카나리가 위치한다. 

그렇기 떄문에 rbp-8 을 하는 것

 

로컬카나리 - rsi 를 해서 rsi의 랭스가 0x28인것을 확인

다시말해 rsi 는 buffer에 위치해서 0x28만큼 떨어져있다.

 

 

마스터카나리는 fs_base에 저장이 되어있다.아래와같이 얼만큼 떨어져있는지 확인가능

Buffer ~ Master Canary 오프셋 확인

 

 

 

 

 

 

 

 

로컬카나리와 전역카나리 모두를 같은 문자로 덮어서 우회 시도

마스터카나리까지 덮으려면 얼마나 문자를 적어야할지 계산을 해야함

Buffer ~ Master Canary 오프셋 848이니까 그것보다 큰 850을 넣어서 테스트 

테스트 continue 하면

첫번째 break point에서 죽음 

 

왜냐면, 그 사이에 덮어서는 안되는 어떠한 주소를 임의의 문자로 같이 덮어버림 -> 그래서 비교하는 로직까지도 도착하지 못하고 그냥 죽어버림

그래서 위치까지 파악하면서 계산을 하고 발생한 크러쉬를 우회해서 접근해야함

memo()

Another bof function

리턴 주소를 조작하여 반복해서 buffer overflow를 유발할 수 있음

 

Shellcode는 일반적으로 버퍼 오버플로우와 같은 취약점을 이용하여 원격 코드 실행을 목표로 하는 작은 코드 조각을 의미합니다. 이 코드는 주로 쉘을 실행하기 위해 설계되며, 공격자가 시스템에서 명령을 실행할 수 있도록 해줍니다.

 

최근에는 카나리와 비슷한 동작을 하는 NX가 Shellcode 공격을 다 막는다.

그렇기 때문에 나온 기법이 ROP 이다.

 

 

ROP (Return Oriented Programming)

  • ROP는 주로 실행 방지 메커니즘(NX 비트 등)을 우회하기 위해 사용됩니다. 이 기술은 악의적인 코드를 직접 삽입하는 대신, 기존의 실행 가능한 코드 조각(“gadget”)을 사용하여 원하는 동작을 수행합니다.
  • 스택 주소는 실행 할 수가 없는데 코드영역은 CPU가 실행시켜야 할 코드가 들어가있으니 리턴할떄 쉘코드를 스택에 쓰고 스택으로가는게 아니라 코드영역으로 가면 어떨까 하는것
  • Idea: 바이너리에 존재하는 코드를 재활용
  • “Gadget”: pop rdi ; pop rsi ; ret
  • 스택을 공격자가 조작한 입력으로 overwrite
  • “gadget”을 연결해 프로그램 실행 흐름 조작

 

 

STAGE2

 

기존에 데이터 영역에 있던 got 이라는 섹션에서 특정 라이브러리 함수에 있는 주소를 하나 유추하고 싶음

ASLR 이 작동되고있기 때문에 정확한 위치 파악을 위해 임의의 주소를 하나 빼오는 것 스크립트에서는 read 오프셋을 빼오려고 시도 이러한 방식을 leak 이라고 한다.

 

***ASLR (Address Space Layout Randomization)**는 시스템의 메모리 주소 공간의 배치를 무작위로 변경하여 보안을 강화하는 기법입니다. 주로 버퍼 오버플로우와 같은 공격을 방어하기 위해 사용됩니다

 

다시말해, 정상적 메모리 값 하나 빼와서 거기서 실제 주소를 계산해서 라이브러리 베이스의 주소를 찾는다.

-> 어느 위치에 메모리가 어디에 올라가 있는지를 파악할 수 있다.

 

STAGE3

ROP call 을 진행

bin/shell 과 특정프로세스를 만들어주는 execve 을 call 해서 빈쉘을 열어준다

스텍 포인터를 맞춰주고 rop를 돌려보면 결론적으로 실행되는 내용은 쉘이 떨어진다.

 

*** execve는 Unix 및 Unix 계열 운영 체제에서 사용되는 시스템 호출로, 새로운 프로세스를 실행하는 데 사용됩니다. 이 시스템 호출은 주어진 프로그램을 현재 프로세스의 메모리 공간에서 실행하기 위해 사용되며, 기존 프로세스의 내용을 대체합니다.


NOTE

Use After Free

댕글링 포인터 (Dangling pointer) 

  • 해제된 영역의 포인터를 가리키고 있는 포인터

 

note.c 파일분석

 

 

excercise 4.1

 

아래와 같이 4가지 기능을 구현할 수 있다.

 

설명예시

    def write(self, idx: int, script: bytes, emoj: int):
        self._menu(1)
        self.conn.sendlineafter(b"index(1 ~ 16): ", str(idx).encode())  // index(1~16) 입력받는 출력이 나오면 입력값 idx 를 받는다
        self.conn.sendlineafter(b"script: ", script)  // script 입력받는 출력이 나오면 시크립트를 작성한다.
        self.conn.sendlineafter(b">>> ", str(emoj).encode())  // >>> 입력받는 출력이 나오면 앞에 이모지를 선택한다.

 

DEBUG 옵션을 추가하여 분석을 하면 무엇을 주고 받는지 확인할 수 있다.

 

 

취약점이 어디서 발생하는지 파악단계

  • 1번에 happy를 write 1번을 read했는데 happy가 잘 나옴
  • erase 로 1번 happy를 지웠다. (1번은 free가 되서 다시 할당할 수 있도록 운영체제에 돌아가야함)
  • 2번에 sad를 write read 하서 1번을 read했는데 sad가 나옴 (1번은 다 지워져있어야 정상아닌가?) 

댕글링포인터와 관련이 있다.

 

이미 해제된 포인터인데 그 값을 계속해서 가지고 있기 때문에 1번으로 다시 읽어도 읽을 수 있는데 심지어 1번에 새드가 저장되어있고 2번해도 새드가 잘 나온다.

 

이것이 USE AFTER FREE 취약점 

 

 

 

 

  • tmux
  • python3 example_04_b.py GDB
  • script 의 break point 를 만들어놈
  • c 할때마다 write, read, 순으로 걸림
  • write A 를 8개, Happy 
  • vis (vis는 Vi 모드에서 작동하는 텍스트 편집기로 힙의 구조를 확인, 분석한다)

"vis" command in gdb at each breakpoint to visualize the heap layout.

 

 

코드 분석

위의 USE AFTER FREE 취약점  스택구조 참고


Shellcoding Test

 

  • $ wget {binary address}
  • # 바이너리에 실행 권한 부여
  • $ chmod +x shellcoding_test
  • $ ./shellcoding_test

Seccomp

  • 리눅스 커널 샌드박스 보안 기능
  • 프로그램을 보호된 영역에서 동작해 시스템이 조작되는 것을 방지
  • 프로세스가 사용할 수 있는 시스템 콜을 제한

seccomp tools로 seccomp 정책 확인 가능

  • $ sudo apt install gcc ruby-dev gem
  • $ sudo gem install seccomp-tools
  • $ seccomp-tools dump ./shellcoding_test

 

0x40000000 이하는 모두 kill 한다.

 

x86_64 Assembly

 

Timing based side channel

 

 

 

정답

아래와 같은 shellcode를 통해서 한 문자열씩 비교해가면서 flag 를 추출할 수 있다.

 

 


시험

PPT 강조표시되어있는 내용

stack over flow

  • Canary

스택 오버플로우 보호 완화기법

  • ROP 는 어떨때 사용가능?

nx가 걸려잇어서 쉘코드를 실행하지 못하게 . 그래서 사용하는 기법

Note

heap → danglin pointer 를 통해서 발생하는 취약점

  • Use After Free
  • Seccomp

프로세스가 사용할 수 있는 시스템 콜을 제한하는 샌드박스 보안 기능

(메모리보호기능은 아니고 샌드박스 보안기능임)

  • Timing-based Side channel

실행시간을 비교한다

정상적일떄는

같은값이면 계속 본다.

정상작동하는지 시간을 비교한다.

 

 

300x250

+ Recent posts