Post

UART 및 CFE 접근

TP-Link AX1500 공유기의 쉘을 얻기 위한 두 번째 방법인 CFE ConsoleUART를 이용한 Shell 획득 입니다.

  1. Firmware Update 페이지
  2. CFE Console
  3. UART를 통한 Shell 획득
  4. 1-day를 이용한 Shell 획득

GND / RX / TX / VCC 식별

uart를 접속하기 전 GND, RX, TX, VCC를 식별해야 합니다.

image.png

GND 식별

GND는 GND에 해당하는 포트와 다른 접지부분을 통전 테스트를 통해 식별했습니다. image.png

VCC 식별

기판을 보면 UART 포트 위에 2개의 포트가 더 존재합니다. 이는 각각 (+), (-)를 나타내며 GND를 이미 식별한 상태이기 때문에 (+), (-)도 각각 식별이 가능합니다.

  • GND는 기본적으로 (-) 입니다. 따라서 (+)와 통전 테스트를 할 때 소리가 납다. 따라서 VCC는 (-)와 통전 테스트를 했을 때 소리가 나면 해당 포트가 VCC임을 확인할 수 있습니다. image.png

RX / TX 식별

RX, TX 식별은 보통로 전류의 양으로 식별이 가능합니다.

  • 전류의 양이 비교적 많으면 TX
    • Boot Log 출력 등으로 데이터를 보내는 양이 많기 때문
  • 전류의 양이 비교적 적으면 RX
    • 입력을 받는 경우가 거의 없기 때문에 이 전류의 양이 상대적으로 적기 때문

위와 같은 방법으로 포트는 다음과 같이 식별되었습니다.

  • 1 : VCC
  • 2 : GND
  • 3 : RX
  • 4 : TX

putty 접속

UART 포트를 식별했기 때문에 UART TTL USB를 이용해서 putty로 접근을 해줍니다.
putty 설정은 다음과 같습니다.

  • Serial port : COM4
  • Baud rate : 115200

image.png

Boot Shell Log

정상적으로 연결되었으면 다음과 같이 Boot Log가 출력되는 것을 확인할 수 있습니다. image.png

CFE(Common Firmware Environment)

보통은 U-Boot와 같은 부트로더를 사용하지만, TP-Link AX1500에서는 Broadcom에서 32비트 및 64비트 SoC 용으로 개발한 펌웨어 인터페이스 및 부트로더인 CFE를 사용합니다.

CFE 환경 진입은 부팅 과정에서 아무 키나 누르면 진입할 수 있습니다. image.png

CFE 명령어

CFE 명령어에도 여러가지가 있는데 주요한 것만 살펴보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
CFE> help
Available commands:

erase_misc_parti    Erase misc partition
x                   Change extra partitions size
phy                 Set memory or registers.
meminfo             Display CFE System Memory
kernp               Updates extra bootloader parameter for kernel. To end input enter // consecutively at any time then press <enter>
sm                  Set memory or registers.
db                  Dump bytes.
dh                  Dump half-words.
dw                  Dump words.
w                   Write the whole image start from beginning of the flash
e                   Erase [n]vram or [a]ll flash except bootrom
ws                  Write whole image (priviously loaded by kermit or JTAG) to flash .
ba                  set linux kernel boot argument
ldt                 load device tree blob from tftp server.
go                  goto and execute from specefic address.
loadb               load binary via network or kermit protocol.
r                   Run program from flash image or from host depending on [f/h/c] flags
p                   Print boot line and board parameter info
c                   Change booline parameters
f                   Write image to the flash
i                   Erase persistent storage data
avs                 Change AVS config
ddr                 Change board DDR config
a                   Change board AFE ID
b                   Change board parameters
reset               Reset the board
pmdio               Pseudo MDIO access for external switches.
spi                 Legacy SPI access of external switch.
pmclog              pmclog
pmc                 pmc cmd
closeavs            pmc close avs cmd
cpufreq             set CPU frequency
force               override chipid check for images.
help                Obtain help for CFE commands

  • ba
    • bootargs를 세팅해주는 명령어
  • r
    • 부팅 진행 (변경 사항 적용)
  • f
    • flash 메모리에 image 쓰기
  • db
    • 메모리 덤프
  • meminfo
    • memory mapping 정보 및 주소 정보보

meminfo

memory 정보를 보여주는 명령어 입니다. memory 주소의 범위와 기타 정보나 Kernel Memory Address와 각 섹션이 어느 주소에 매핑이 되어있는지 보여줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CFE> meminfo

                  System Memory
Memory             :  0x00000000 - 0x0fffffff size 268435456
Reserved/Boot      :  0x00000000 - 0x01000000
Reserved           :  0x01000000 - 0x03085524
Free Memory        :  0x03085524 - 0x0fffffff size 217557724

                Stack
Range              :  0x01083524 - 0x01085524 size : 0x00002000 SP:0x01085158

                Heap
Range             :  0x01085524 - 0x03085524
Total bytes       :  33554432
Free bytes        :  33231504
Free nodes        :  2
Allocated bytes   :  321152
Allocated nodes   :  72
Largest free node :  33231484
Heap status       :  CONSISTENT

Kernel Memory Address

1
2
3
4
5
6
7
8
9
10
11
12
13
Memory: 253488K/262144K available (3580K kernel code, 131K rwdata, 984K rodata, 184K init, 275K bss, 8656K reserved, 0K cma-reserved, 0K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    vmalloc : 0xd0800000 - 0xff000000   ( 744 MB)
    lowmem  : 0xc0000000 - 0xd0000000   ( 256 MB)
    pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
    modules : 0xbf000000 - 0xbfe00000   (  14 MB)
      .text : 0xc0018000 - 0xc048d3c8   (4565 kB)
      .init : 0xc048e000 - 0xc04bc000   ( 184 kB)
      .data : 0xc04bc000 - 0xc04dcfa0   ( 132 kB)
       .bss : 0xc04dcfa0 - 0xc0521bf8   ( 276 kB)

  • lowmem
    • 커널이 물리적 주소에 직접 접근하는 데 사용할 수 있다.
  • vmalloc
    • swap 영역, 커널 모듈 또는 일부 I/O 장치에 대한 버퍼 할당에 사용됨.
    • 비연속 방식을 기반으로 페이지 프레임을 할당할 수 있다.
    • 외부 조각화 방지
  • pkmap
    • kmap() 을 사용하여 HIGHMEM 페이지를 매핑하면 이 영역에 가상 주소가 할당 된다.
    • 고메모리 페이지 프레임을 커널 주소 공간에 오래 지속되는 매핑을 설정할 수 있다.
  • fixmap
    • lowmem 주소와 같은 마지막 1GB 뿐만 아니라 RAM의 모든 물리적 주소를 참조할 수 있다.
    • 수정 매핑된 선형 주소는 lowmempkmap 보다 효율적이다.
    • 고정 매핑을 위해 전용 Page Table Descriptorrk 있으며, 여기에서 kmap_atomic 을 사용한 HIGHMEM 페이지 매핑이 할당된다.

Router Shell

UART 접속 후 CFE 진입을 하지 않고 기다리면 다음 화면과 같이 Shell 이 떨어집니다. image.png

그러나 해당 Shell에 User 명과 Password를 입력해도 로그인을 할 수 없었습니다. 이유는 다음과 같습니다.

  • /etc/passwd 내용
    • root 계정을 제외한 나머지 계정은 모두 /bin/false 를 사용하고 있음. alt text
  • /etc/shadow 내용
    • root 계정은 Password가 설정되어 있지 않음 alt text

Result

  • CFE 환경에서 bootargs를 수정할 수 있음.
  • 하지만 bootargs로 바로 shell 접근하는 것은 잘 안됨.
  • Router Shell은 계정 설정 문제로 Shell을 얻는 것이 불가능
  • CFE에서는 memory dump 기능이 있어 로그인이 안 되더라도 추가적인 정보를 얻을 수 있음.
This post is licensed under CC BY 4.0 by the author.