諸行無常

by

ipTIME AX2004M용 OpenWrt

SW 이야기

언젠가 PR넣을 것 같은 기분이 듭니다

쏘-쓰는 여기어딘가 있음 https://github.com/koreapyj/openwrt/tree/openwrt-21.02.1

 

GitHub - koreapyj/openwrt: This repository is a mirror of https://git.openwrt.org/openwrt/openwrt.git It is for reference only a

This repository is a mirror of https://git.openwrt.org/openwrt/openwrt.git It is for reference only and is not active for check-ins or for reporting issues. We will continue to accept Pull Request...

github.com

 

openwrt-21.02.1-ramips-mt7621-iptime_ax2004m-squashfs-factory.bin
8.63MB

 

그냥 순정 펌웨어 업데이트로 밀어넣으면 돼요

리셋버튼 정상작동유무 모르니 조심히 쓰세요 벽돌복구하려면 UART 꽂아야 할 지도 모릅니다

부트로더 iptime 기본 리커버리 모드는 정상작동함 혹시 벽돌되면 전원 꽂으면서 리셋버튼 꾹 눌러보세요 

한빛전자 CAPL-6000용 OpenWrt

SW 이야기

이 글의 내용은 GitHub 저장소 README.md 파일의 내용을 복사한 것입니다.

한빛전자 LG U+향 CAPL-6000용 OpenWrt v19.07.2

  • 저도 잘 모르고 만들었기 때문에 무언가 문제가 있을 것 같습니다.
  • MR 환영합니다.

작동이 되지 않는 기능

  • WiFi
  • 그 외 발견하지 못한 기능이 더 있을 수 있음

되긴 되는데 뭔가 마음에 안 드는 기능

  • ip link up이 느림. 부팅 개시 후 60초 이상 걸리는 것 같음.

빌드 방법

  • 표준적인 OpenWrt의 빌드 방법을 따르면 됩니다. 제품 이름은 Hanbit Electronics CAPL-6000으로 ar71xx에 등록되어 있습니다.

설치 방법

  • 안정된 버전이 아니며 순정 펌웨어로의 부팅이 되지 않을 수 있습니다. 배포자는 이에 대해 유무형을 막론하고 어떠한 책임도 지지 않으므로 본인 부담으로 진행하시기 바랍니다.
  1. 관리 페이지에 로그인합니다.

  2. 시스템 설정으로 이동한 뒤 F12를 눌러 개발자 도구를 열고 <body> 태그 바로 하위에 있는 <form>태그를 눌러 다음과 같이 변경합니다.

     <script>
       function FirmStat(pForm) {
         var firmware_name;
         var index_1, index_2;
    
         var upgradeMsg = "ㄹㅇ?";
    
         firmware_name = pForm.file.value;
    
         if (((index_2 = firmware_name.lastIndexOf(".")) != -1) &&
           (index_2 > parseInt(index_1 + 1)) &&
           (firmware_name.substring(index_2) == ".bin")) {
    
           // 경고 문구 입력  
           yesorno = confirm(upgradeMsg);
    
           if (yesorno == true) {
             document.body.style.cursor = 'wait';
             document.forms[0].submit();
           }
         } else {
           alert("upload 파일이 아닙니다. 파일을 다시 선택해 주세요");
           return;
         }
       }
     </script>
     <form action="upgrade.cgi" method="POST" ENCTYPE="multipart/form-data">
       <div align=center>
         <table border="0" cellpadding="0" cellspacing="1" width="620" bgcolor="#CCCCCC">
           <tr>
             <td width="620" bgcolor="white">
               <table border="0" cellpadding="2" cellspacing="1" width="620">
                 <tr>
                   <td class=contents width=165 bgcolor=f0f0f0 align=center>소프트웨어 업그레이드</td>
                   <td bgcolor=f8f8f8><input type="file" name="file" style="background-color:white; value=" image.bin"
                       size=30>
                     <input class=btn type="button" name="upgradebtn" value="업그레이드 시작" style="width:100"
                       Onclick="FirmStat(this.form);">
                   </td>
                 </tr>
               </table>
             </td>
           </tr>
         </table>
       </div>
     </form>
  3. openwrt-ar71xx-generic-capl_6000-initramfs-kernel.bin를 선택하여 펌웨어 업데이트를 진행합니다. 업데이트가 완료되면 인터넷 연결이 끊기게 되며 약 2~3분 뒤에 다시 인터넷 연결이 가능해집니다.

  4. 인터넷에 연결되면 PuTTY등 ssh 클라이언트를 사용하여 192.168.1.1로 접속합니다. 계정은 root에 패스워드는 없습니다.

  5. 정상적으로 접속되면 셸에서 아래 내용을 입력하여 실행시킵니다.

     wget http://api.dcmys.kr/capl6000/openwrt-ar71xx-generic-capl_6000-squashfs-sysupgrade.bin -O - | mtd -e firmware write - firmware
  6. 완료되면 reboot를 이용하여 재부팅합니다.

  7. 재부팅이 완료되고 인터넷에 연결되면 다시 192.168.1.1로 ssh 접속합니다.

  8. passwd를 입력하여 root 패스워드를 설정합니다.

  9. 이 배포판에는 luci 등 기본적인 패키지가 포함되어 있지 않습니다. 필요한 패키지가 있는 경우 opkg를 이용하여 설치하시기 바랍니다.

벽돌이 된 경우

  • 기본적으로 이 제품은 두 개의 파티션으로 구성되어 있습니다. 순정 펌웨어 기준으로 1번 파티션(@0x9f050000/0x770000)은 업데이트를 위한 영역이며 2번 파티션(@0x9f7c0000/0x770000)은 현용 펌웨어를 위한 영역입니다.
  • 둘 중 어느 한 쪽에 문제가 생겨(magic number+crc32 mismatch) 부팅을 진행할 수 없게 되면 다른 쪽 파티션으로 부팅을 시도합니다.
  • 그러나 두 파티션 모두 문제가 생기는 경우 완전한 부트 불량에 빠지게 되며 UART 연결 없이 복구할 방법은 없습니다.
  • 이러한 일이 일어난 경우 USB to UART 장치를 구입하여 부트로더 셸을 통해 tftp로 initramfs를 실행하여 복구하는 것이 가능합니다.
  • 기기의 UART 포트에 대해서는 이곳을 참고하시기 바랍니다.

개인키로 ssh 접속시 sudo 패스워드 입력하지 않기 (ubuntu focal)

SW 이야기

라는 내용으로 검색을 해보면, 국내 해외 가리지 않고 대부분 /etc/sudoersNOPASSWD를 사용하라고 한다.

그러나, 이는 sudo의 인증 자체를 무력화시키는 방법으로, 물리적 취약점 외에도 악의적 스크립트에 의한 root 탈취 등 보안 리스크가 크다고 볼 수 있다.

여기서는 pam-ssh-agent-auth를 이용하여 sudo에 ssh-agent 인증을 추가하는 방법을 알아본다.

libpam-ssh-agent-auth 설치

먼저 libpam-ssh-agent-auth를 설치한다.

$ sudo apt update
$ sudo apt install libpam-ssh-agent-auth

pam.conf 수정

pam.conf를 수정하여 위에서 설치한 libpam-ssh-agent-auth를 사용하도록 한다.

배포판에 따라 차이가 있지만 Ubuntu의 경우 /etc/pam.d 폴더가 존재하고 /etc/pam.d가 존재하면 /etc/pam.conf가 무시되기 때문에 /etc/pam.d를 수정해야 한다.

common-auth 상위에 오도록 아래와 같이 수정한다.

/etc/pam.d/sudo

...

# ssh-agent auth
auth       sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys
@include common-auth

...

sudo 버전이 1.8.5 미만인 경우, sudoers도 수정해야 한다.

/etc/sudoers ($ sudo visudo)

...

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# ssh-agent auth
Defaults        env_keep+=SSH_AUTH_SOCK

...

따라했는데 안되는 이유

  1. ssh-agent가 켜져있고
  2. 키가 등록되어 있고
  3. 클라이언트에 ssh-agent 포워딩이 활성화되어 있고
  4. ~/.ssh/~/.ssh/authorized_keysroot또는 현재 사용자의 소유이며 자기 자신을 제외하고는 쓰기 권한이 없어야
    하는데 이 중 무언가 하나가 빠졌을 것이다.

그래도 모르겠는 경우

상기한 /etc/pam.d/sudopam_ssh_agent_auth.so가 있는 줄 끝에 debug를 붙인 다음 /var/log/auth.log를 잘 살펴보면 왜 안되는지 이유를 알려줄 것이다.

ssh-agent 인증의 보안성

기본적으로 포워딩되었다고 하더라도 ssh-agent 소켓은 다른 유저가 사용할 수 없다.

그러나 root는 모든 것이 가능하므로 당연히 내 ssh-agent 소켓을 접근해서 나의 개인키로 다른 곳에 인증하는 것 또한 가능하다.

root에 내가 아닌 다른 사람이 접근할 수 있는 환경이라면 NOPASSWD로 인한 보안 위협을 차단하고 새로운 형태의 보안 위협을 만드는 것이 될 수 있으므로 사용하지 않는 것이 좋겠다.

존재하는 (거의) 모든 인터넷전화 SIP 계정 알아내기

SW 이야기

오랜만입니다.

이번에 업무상 필요로 K전화국에서 인터넷전화를 개통했습니다.

그런데 아무래도 고정된 장소에서 업무를 하는게 아니다보니 기왕이면 가지고 다닐 수 있었으면 좋겠습니다.

착신전환은 통화료가 발생하므로 피하고 싶습니다.

방법을 고민하다 SIP 계정을 빼내서 다른 단말기에 넣으면 되겠다는 생각이 들었습니다.

그래서 빼냈습니다.

방법

이 글에서는 그 방법을 서술합니다. 글이 너무 친절하면 아무나 따라하니까 약간 불친절하게 하기로 합니다.

  1. 먼저 아무 인터넷전화나 준비합니다. 이 글에서 서술하는 방법으로 진행하려면 DNS 서버 주소나 SIP 서버 주소 중 적어도 한 개는 변경할 수 있어야 합니다.
  2. SIP 서버 주소를 변경할 수 있으면 서버 주소를 로컬 주소로 변경한 후 6으로 건너뜁니다.
  3. 먼저 순정 상태의 SIP 서버 또는 SIP 프록시 서버의 도메인을 알아내야 합니다. Wireshark를 통해 SIP 패킷과 DNS 패킷을 유심히 보다보면 찾을 수 있습니다.
  4. 3에서 DNS 패킷을 도저히 찾을 수 없는 경우 SIP 서버 주소가 IP주소로 입력되었을 수 있습니다. 이런 경우 라우터 설정을 변경해서 로컬 IP가 SIP 서버 IP처럼 보이도록 라우팅해서 진행합니다. 6으로 가세요.
  5. 3에서 알아낸 도메인을 로컬 서버의 주소를 가리키도록 DNS 캐시에 독을 탑니다.
  6. 몇 번 재부팅하다보면 단말기가 접속 실패 오류를 띄우게 됩니다. 이제 모두 준비되었습니다.
  7. SIP MITM을 받아서 실행합시다.
  8. 단말기가 접속을 시도하면 계정과 패스워드가 표시됩니다. 이제 잘 쓰시면 됩니다.

왜 되는가?

과거에는 패스워드가 Basic 인증을 통해 암호화되지 않은채 전송되었습니다. 2010년 언저리였던 것 같은데, 이때 많은 분들이 myLG070 계정을 빼내서 사용하셨죠.

그런데 이게 문제가 되어 TTA에서는 SIP에 대해 Digest 인증을 권고하게 되어 이후 한동안 SIP 계정을 빼낼 수 없게 되었습니다.

그러나 호환성을 위해 단말기는 여전히 Basic 인증을 지원하고 있습니다. 이때문에 저는 단말기에게 가짜 서버를 알려주어 Basic 인증을 요구하면 될 것이라 생각했습니다.

그리고 이게 된 거죠.

보안 취약점이 아닌가?

이는 중간자 공격과 다운그레이드 공격을 수행합니다. 일종의 보안 취약점이라고 볼 수도 있습니다. 그러나 통신사 서버에만 붙으면 되는 일반적인 인터넷전화와는 달리 업무용 전화는 때때로 고객사의 PBX와도 동작이 가능해야 합니다. 따라서 제조사는 Basic 인증의 지원을 포기하기 어려운 상황입니다.

그렇다면 통신사는 SIP over TLS와 같은 다른 방법을 통해 충분히 SIP 계정의 노출을 방지할 수 있다고 생각되며 이것이 가장 정상적이고 합리적인 방법이며 보안성도 향상시킬 수 있으리라 생각합니다.

사족

굳이 통신사가 SIP 계정의 노출을 막으려는 이유를 저는 잘 모르겠습니다.

kt LTE egg+ A 관리자 모드

SW 이야기/kt 에그

이번에는 kt LTE egg+ A (인포마크 IML450) 제품의 관리자 모드를 접속해보겠습니다.

 

 

동작 확인 소프트웨어 버전 : R7202 (Aug 8 2017)

 

1. 단말기 배터리 커버를 분리하고 상단의 SSID 맨 마지막 세 자리 숫자 (ktEgg_xxx)를 기억합니다.

2. 에그의 네트워크에 접속한 다음, 브라우저를 통해 아래 주소로 접속합니다. 192.168.1.1:50xxx의 xxx에는 1에서 기억해둔 숫자를 입력합니다.

http://192.168.1.1:50xxx/cgi-bin/webmain.cgi?act=change_htpasswd&ac=ADMIN&id=admin&passwd=123456&confirm=123456

3. 이제 http://192.168.1.1:50xxx/ 로 접속한 다음 ID admin, 패스워드 123456으로 로그인합니다.

 

관리자 모드로 접속되었습니다.