GRUB加密、修復和破解密碼實戰指南

GRUB加密、修復和破解密碼實戰指南



GRUB(Boot Loader

  • 從系統啟動流程可以得知,在BIOS讀取相關信息之后,接下來是去第一個可以啟動的設備當中的MBR中讀取Boot Loader信息,Boot Loader提供具有菜單功能、直接加載內核信息,以及相關的控制權轉交功能。所以說系統啟動必須要有Boot Loader,然后才能去加載內核。

  • Boot Loader存儲于MBR當中,MBR只有512bytes,其中446bytes存儲Boot Loader,但是Boot Loader功能很強大,所以446bytes是遠遠不夠的,所以就用到了grub,并將Boot Loader的程序運行與配置項加載分成三個階段(stage)來運行。


grub: GRand Unified Bootloader

一、版本如下:

         grub 0.x: grub legacy

         grub 1.x: grub2




二、grub legacy:

1.分為三個階段

⊙ stage1: 運行Boot Loader主程序,這個程序必須要安裝在啟動區,即MBR中。因為MBR空間有限,因此在MBR當中僅安裝Boot Loader的最小程序,并沒有安裝Boot Loader的相關配置文件;

⊙ stage1_5: 在MBR隨后的扇區中存放,讓stage1中的bootloader能識別stage2所在的分區上的文件系統(相當于文件系統的驅動);

⊙ stage2:通過Boot Loader加載所有配置文件及相關的環境變量參數信息,這些配置文件及相關的環境參數都存放于磁盤分區上的/boot/grub目錄下。


2.配置文件:

 /boot/grub/grub.conf<–/etc/grub.conf

wKiom1fX0oyhO0YcAACKYbIiBkM814.png



3.stage2及內核等通常放置于一個基本磁盤分區(boot分區)

⊙ boot單獨分區是用來存放與linux系統啟動有關的程序,比如,內核文件、啟動引導裝載程序,啟動菜單配置文件等;

⊙ boot作為一個單獨的分區,也就意味著這個單獨分區下有一個grub,因為grub剛啟動的時候,操作系統還沒有啟動(真正的根文件系統還沒有被加載),所以,不能通過訪問/boot/grub來實現,但是我們又需要訪問這個文件來執行stage2 階段。所以,grub中就有一個root命令,指明的就是把stage2 階段直設為根,而grub自帶有文件系統驅動(stage 1.5),所以就可以直接訪問分區及根下的所有文件即kernel,initrd等來選擇內核啟動;

⊙ boot目錄,有沒有單獨分區(或者說引導分區是不是一個獨立的分區),決定了在grub中的訪問路徑是否一樣。而grub中的root命令,指明的就是這個根分區是誰,如果boot被單獨分區了,那么就直接指向這個新分區,訪問路徑就直接把boot給去掉了;如果boot沒有被單獨分區,就是掛在根分區上,那就意味著/boot目錄是繞不過去的,訪問的時候只能先訪問根,在訪問根下的boot。

⊙ grub要想訪問某一分區,這個分區必須是基本磁盤分區,不可能是提供了非常復雜的驅動程序(如RAID,LVM)。如果想把根做的復雜些(比如LVM)但又不對boot做單獨分區,那把邏輯卷往分區上一放,就找不到grub中的stage2階段了,所以,要想把根做的復雜,就只能把boot作為一個單獨的基本磁盤分區;

⊙ 如果不使用邏輯卷,boot是可以不用單獨分區的。



4.grub功用

  • 提供啟動菜單、并提供交互式接口;

         e: 編輯模式,用于編輯菜單

         c: 命令模式,交互式接口

wKiom1fX1wayq-ZaAAAeXXMld7Y515.png

  • 加載用戶選擇的內核或操作系統;

        允許傳遞參數給內核

        可隱藏啟動菜單

  • 為菜單提供了保護機制;

        為編輯啟動菜單進行認證

        為啟用內核或操作系統進行認證



5.識別硬盤設備:

  (hd#,#) 表示第幾塊磁盤的第幾塊分區

  • 硬盤代號以小括號()括起來

  • hd#: 磁盤編號,用數字表示;從0開始編號;

  • #: 分區編號,用數字表示; 從0開始編號;

   如:(hd0,0)表示 第一塊硬盤,第一個分區



6.grub的命令行接口

  • help: 獲取幫助列表

  • help KEYWORD: 詳細幫助信息

  • find (hd#,#)/PATH/TO/SOMEFILE:

  • root (hd#,#)

  • kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可添加許多內核支持使用的cmdline參數

        例如:max_loop=100 selinux=0 init=/path/to/init

  • initrd/PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;

  • boot: 引導啟動選定的內核

  • cat /proc/cmdline 內核參數

  • 內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt



7.手動在CentOS 6 grub命令行接口啟動系統:

  • grub> root (hd#,#) 這里的根為grub的根,而非根文件系統的根(真正的文件系統還沒有加載)

  • grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE (文件系統的跟)

  • grub> initrd/initramfs-VERSION-RELEASE.img

  • grub> boot # 啟動

wKiom1fZTkPg7HInAAAcIYWQQbM228.png

   如果每次都手動編輯,并不是所有人都能夠完成的,所以就加了一個菜單項,菜單上顯示的內容其實也就是grub配置文件中的設置,如下所示:

wKioL1fZWq6ytw0AAAAfTwKxfVQ371.png



三、grub legacy:配置文件


1.查看配置文件/boot/grub/grub.conf如下:

  1 # grub.conf generated by anaconda
  2 #
  3 # Note that you do not have to rerun grub after making changes to this file
  4 # NOTICE:  You have a /boot partition.  This means that
  5 #          all kernel and initrd paths are relative to /boot/, eg.
  6 #          root (hd0,0)
  7 #          kernel /vmlinuz-version ro root=/dev/mapper/vg0-root
  8 #          initrd /initrd-[generic-]version.img
  9 #boot=/dev/sda
 10 default=0
 11 timeout=5
 12 splashimage=(hd0,0)/grub/splash.xpm.gz
 13 hiddenmenu
 14 title CentOS 6 (2.6.32-642.el6.x86_64)
 15         root (hd0,0)
 16         kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun
    16 crashkernel=auto rd_LVM_LV=vg0/root  KEYBOARDTYPE=pc KEYTABLE=us  crashkernel=auto
 17         initrd /initramfs-2.6.32-642.el6.x86_64.img

2.每行含義如下:

  • default=#: 設定默認啟動的菜單項;假如同時裝有多個操作系統,0表示定義的第一個title系統,1表示定義的第二個title系統,以此類推;

  • timeout=#:表示可供選擇的等待時間,如果超出5秒,則使用默認的啟動條目default定義的;

  • splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜單背景圖片文件路徑;

  • hiddenmenu:隱藏菜單,默認是不顯示菜單信息,如果要想顯示菜單,可以將該配置信息注釋即可;

  • password [–md5] STRING: 啟動菜單編輯認證

  • title TITLE:定義菜單項“標題”(操作系統名稱), 可出現多次,用來引導不同的操作系統或內核;

        ◎root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub“根”。也就是說,表示的是內核文件的存放位置,這里指的是分區位置,而非根目錄;
        ◎kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:內核的名稱,以及一些啟動時的核心參數。由于啟動過程中需要掛載根目錄,因此就需要指定根目錄所在的分區。rhgb表示色彩顯示,quiet表示靜默模式加載內核。
        ◎initrd/PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件,虛擬文件系統;
        ◎password [–md5] STRING: 啟動選定的內核或操作系統時進行認證。

=================================================================================

3.生成密碼的命令:

      grub-md5-crypt

   openssl passwd -1

wKioL1fX8IfgHVuvAAAlWLQbOZ8537.png


[實驗1為編輯啟動菜單進行認證;為啟用內核或操作系統進行認證]

操作步驟及過程如下:

  1)復制一份內核文件,改名為Tao Linux,并分別在第一個title之前和第二個title之后添加生成的加鹽密碼,保存并退出,并重啟系統;

wKiom1fX-JuRqIyTAADkplhUvpk441.png

   2)重啟系統之后發現要為進行編輯啟動菜單的認證,效果如下:

wKioL1fX-JvyplA_AABBxVqoDzg827.png

  3)按“p”鍵輸入密碼之后,可以發現原來的提示信息又回來了,這是我們就可以編輯了

wKiom1fX-JuDwbADAAAeO-Lp09w387.png

wKioL1fX-JvgCZoBAAAtD0q4uQs442.png

  4)選擇第二個內核作為啟動程序,按回車鍵發現要想啟動內核,要輸入密碼認證,說明我們為內核設置的密碼,起作用了。

wKiom1fX-Jzyljx4AAAi2cEFcpg130.png

wKioL1fX-JyTK4dmAAASuvF5INg678.png



4.破解root口令:

   啟動系統時,設置其運行級別1

5.進入單用戶模式

  • 編輯grub菜單(選定要編輯的title,而后使用e命令);

  • 在選定的kernel后附加1, s, S或single都可以然后按回車鍵;

  • 在kernel所在行,鍵入“b”命令,進入單用戶模式


[實驗2]:單用戶模式下修改密碼:

    1)在進入開機界面的時候,按任意鍵進入菜單界面,如下演示:wKiom1fZN9mz5HExAAkW_6BR1MI990.gif

  2)因為我們在編輯啟動菜單前設置了認證,所以需要輸入密碼,按“p”輸入密碼后進入編輯菜單,然后選定要啟動的內核,按“e”鍵進入編輯模式,如下演示:wKiom1fZSrrjF96RAB2FlCzwNhs185.gif

 3)選定好要啟動的kernel后,按“e”鍵進入,然后在選定的內核后添加1, s, S或single,然后按回車鍵,緊接著在kernel所在行輸入“b”進入單用戶模式,如下演示:wKiom1fZSgSB0C-LABxa7F5GSFM113.gif


6.安裝grub的兩種方法:

1)使用grub-install命令直接修復
   安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到DIR/boot目錄下,命令如下:
        grub-install --root-directory=DIR /dev/DISK
   
2)使用grub進入命令提示符下的接口進行修復:
        grub> root (hd#,#)
        grub> setup (hd#)
注意:
  法一:不要求指定的根下有boot目錄,以及下面的grub,stage1,stage1.5,stage的文件,他會自動檢測,裝好并修復;
  法二:要求在指明的root設備上必須要存在有一個grub目錄,并且其下的stage1,stage1.5,stage2 這些文件必須    存在才可以修復。

[實驗3破壞grub的第一階段,并修復grub,完成啟動](以CentOS 6 為例)

 

實驗步驟如下:

  1)為了防止意外,我們首先將bootloader備份,如下:

[root@CentOS6 ~]# dd if=/dev/sda of=/root/mbr.bak count=1 bs=512
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000406463 s, 1.3 MB/s

 2)接著把grub的第一階段破壞了(注意不要把分區表給破壞了),如下:

[root@CentOS6 ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1 # 破壞grub第一階段
1+0 records in
1+0 records out
200 bytes (200 B) copied, 0.00909061 s, 22.0 kB/s
[root@CentOS6 ~]# sync  #同步到磁盤

   3)其實到這里,如果重啟系統的話已經啟動不起來了,因為把bootloader的第一階段破壞了,后面的所有啟動流程都將無法進行,連啟動菜單都沒有。只能通過在救援模式的環境下進行修復,因為在這里,我們沒有重啟,所以可以直接手動修復,方法如下:

 方法一:

[root@CentOS6 ~]# grub-install --root-directory=/ /dev/sda # 會自動的吧grub的第一階段重新裝一次
Installation finished. No error reported.
This is the contents of the device map //boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

# this device map was generated by anaconda
(hd0)     /dev/sda   #修復完成
[root@CentOS6 ~]# sync # 修復完成,并同步到磁盤

  方法二:grub命令,進入其命令提示符的接口下進行修復

[root@CentOS6 ~]# grub  # 使用grub命令修復
Probing devices to guess BIOS drives. This may take a long time.

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0)   # 首先指明誰是根
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)   # 安裝第一階段,并指明安裝的硬盤
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no # 首先會檢測是否存在
 Checking if "/grub/stage1" exists... yes  # 查找stage1/1.5/2文件是否存在
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded  # 提示安裝成功
Done.
grub> quit #退出
quit
[root@CentOS6 ~]# sync # 同步到磁盤

[實驗4救援模式下怎樣修復grub]

   如上實驗是在不重啟的情況下進行修復的,那怎樣在重新啟動是進行修復grub呢?那就要采用救援模式了,方法如下:

步驟如下:

 1)首先破壞grub的第一階段,重新啟動

[root@CentOS6 ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1 # 破壞grub第一階段
1+0 records in
1+0 records out
200 bytes (200 B) copied, 0.00909061 s, 22.0 kB/s
[root@CentOS6 ~]# sync  #同步到磁盤

  可以看到,系統已經徹底歇菜,啟動不起來了!

wKioL1fbcy6iAN2XAAARl0peQR4183.png

    

     2)這個時候我們就需要掛載系統安裝光盤,進入緊急救援模式,如下,選擇第三項即可,或者按esc鍵,在命令行模式下輸入 # linux rescue 就可進入救援按模式wKioL1fbdJGjHMycAAby7RytWJo002.png

  

   3)進入救援模式會提示要選擇的相關信息。首先,選擇要使用的語言:

wKiom1fbeTCCWGJ4AAAZxZMu00o580.png

   選擇要使用的鍵盤

wKiom1fbeUqAGYfaAAAWqYb1gzA664.png

  這里提示我們要不要啟動網絡功能,如果我們需要通過上網下載文件來修復就選擇啟動網絡服務,這里我們不需要,選擇NOwKioL1fbeUqAuwLEAAAPBH_gLwE037.png

   這里主要是提示我們,救援模式會嘗試去尋找硬盤上是否有操作系統,如果有的話會掛載到/mnt/sysimage 下,可以到這個里面尋找所需要的文件。這里我們選擇continue

wKiom1fbeUuyYQrMAAAmzmyqqVI766.png

  搜索并提示我們系統找到了,并且已經掛載至/mnt/sysimage 下,如果要使用的話可以使用 chroot /mnt/sysimage 命令把根切換過去。選擇OK

wKioL1fbeUugk6LaAAAXHF_ZXCo023.png

  提示我們系統已經掛載到/mnt/sysimage 目錄下

wKiom1fbeUyxtA6eAAALmyse2Go835.png

   提示我們是否開啟一個shell腳本,這里選擇OK

wKioL1fbeUzAdE3mAAAMll9o8e0282.png

 4)上面這些信息選擇好以后就進入到了救援模式下,并打開了一個shell提示符,我們執行如下操作即可:

wKioL1fbgp_wMEDBAABNn6LD1To938.png

 5)成功啟動,并登陸:

wKiom1fbg_riMO8YAAASe10Bla8037.png



總結:GRUB啟動故障排除案例

1.MBR中grub損壞,1_5階段的數據損壞,2階段的grub損壞

2.initramfs*.img文件損壞,內核文件損壞

3./boot/grub/grub.conf文件丟失

4./etc/fstab丟失,無法掛載根等文件系統

5./boot 目錄全部的文件丟失

解決方法(都是在救援模式下)

1. MBR中grub損壞,1_5階段的數據損壞,2階段的grub損壞

救援模式,

  • chroot /mnt/sysimage 切根,改變磁盤根目錄

  • grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區


2. initramfs*.img文件損壞,內核文件損壞

 1)initramfs*.img文件損壞,解決方法:

  # chroot=/mnt/sysimage
  # mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  #創建

 2)內核文件損壞

救援模式下

  • mkdir /mnt/cdrom

  • mount /dev/cdrom /mnt/cdrom  掛載光盤

  • 進入/mnt/cdrom/Packages/ 目錄下覆蓋安裝kernel包, 
    rpm -ivh–replacepkgs kernel-VERSION.rpm –root=/mnt/sysimage –force

  • 安裝完成后會在/boot目錄下自動生成相應版本的vmlinuz文件. 
    (前提是內核版本未更新, 和光盤中的內核版本一致)


3. /boot/grub/grub.conf文件丟失

這個新建一個寫上引導等信息就行,詳見實驗3,實驗4


4. /etc/fstab丟失,無法掛載根等文件系統

 同樣新建一個/etc/fatab、填寫上掛載信息
 lvm 的話需要激活lvm邏輯卷 


5. /boot 目錄全部的文件丟失  

 結合上面,先MBR修復,然后內核文件修復和initramfs*.img文件 修復


原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/47754

(0)
zhumengxiaotaozhumengxiaotao
上一篇 2016-09-19
下一篇 2016-09-19

相關推薦

  • 第一篇博客 簡單說下最近的學習心得吧

        今天是個特殊的日子, 來到馬哥教育已經一周時間了,剛來的時候滿環信心,感覺人生充滿了希望,但是接下來的學習讓我感受到了什么是絕望,剛開始的兩天完全是一種朦朧的狀態,不知道干什么,敲得命令也不理解,完全是生搬硬套,沒有自己的認知,當時就有一種沖動想要一走了之,后來想想算了 ,然后就堅持到了現在,此時感覺當時的決定是對的,經過一周的學…

    2017-07-15
  • 一周作業體會

    1、描述計算機的組成及其功能 CPU+控制器+RAM+輸入設備+輸出設備 2、按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別 答:最主流的發行版主要有: Debian/Slackware/Redhat,我們日常最常使用的操作系統大多是上述發行版的二次再發行版,例如:基于Debian的二次發行版Ubuntu和Knopix,基于Slac…

    Linux干貨 2016-10-31
  • 1021作業

    關于用戶和組相關配置文件的總結 /etc/passwd:用戶及相關屬性信息 在Linux /etc/passwd文件中每個用戶都有一個對應的記錄行,它記錄了這個用戶的一些基本屬性。系統管理員經常會接觸到這個文件的修改以完成對用戶的管理工作。這個文件對所有用戶都是可讀的。但是Linux /etc/passwd文件中都有些什么內容呢? #cat/etc/pass…

    Linux干貨 2016-10-24
  • LVS的四種模型

    相關術語: vs:Virtual Server,Director,Dispatcher,Balancer rs:Real Server,upstream server,backend server lvs集群的類型: lvs-nat:修改請求報文的目標IP lvs-dr:操作封裝新的MAC地址; lvs-tun:在原請求IP報文之外新加一個IP首部; lvs…

    Linux干貨 2016-10-30
  • 2、文件通配符,文件創建、復制等操作

    1:bash特性之狀態返回值 變量$?,用于保存命令執行成功與否的狀態,0表示成功,1-255表示失敗,以命令ls為例: 執行成功 [root@localhost ~]# ls /usr/     bin  etc  games &nbsp…

    Linux干貨 2016-09-19
  • Linux基礎目錄命名的法則及規定功能

    Filesystem Hierarchy Standard (FHS):重點在于規范每個特定的目錄下應該要放置什么樣子的數據。 這樣做好處是,在Linux操作系統就能夠在既有的面貌下(目錄架構不變)發展出開發者想要的獨特風格。 /bin:系統有很多放置執行文件的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式下還能夠被操作的指令。 在/bin底下…

    Linux干貨 2017-07-02
欧美性久久久久