diff --git a/cmd/cmd.go b/cmd/cmd.go index 558b035..8607a84 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -12,7 +12,6 @@ import ( var ( browser string - exportData string exportDir string outputFormat string verbose bool @@ -23,18 +22,16 @@ func Execute() { app := &cli.App{ Name: "hack-browser-data", Usage: "Export passwords/cookies/history/bookmarks from browser", - UsageText: "[hack-browser-data -b chrome -f json -dir results -e all -cc]\n Get all data(password/cookie/history/bookmark) from chrome", - Version: "0.2.2", + UsageText: "[hack-browser-data -b chrome -f json -dir results -cc]\n Get all data(password/cookie/history/bookmark) from chrome", + Version: "0.2.3", Flags: []cli.Flag{ &cli.BoolFlag{Name: "verbose", Aliases: []string{"vv"}, Destination: &verbose, Value: false, Usage: "Verbose"}, &cli.BoolFlag{Name: "compress", Aliases: []string{"cc"}, Destination: &compress, Value: false, Usage: "Compress result to zip"}, &cli.StringFlag{Name: "browser", Aliases: []string{"b"}, Destination: &browser, Value: "all", Usage: "Available browsers: all|" + strings.Join(core.ListBrowser(), "|")}, &cli.StringFlag{Name: "results-dir", Aliases: []string{"dir"}, Destination: &exportDir, Value: "results", Usage: "Export dir"}, &cli.StringFlag{Name: "format", Aliases: []string{"f"}, Destination: &outputFormat, Value: "json", Usage: "Format, csv|json|console"}, - &cli.StringFlag{Name: "export-data", Aliases: []string{"e"}, Destination: &exportData, Value: "all", Usage: "all|" + strings.Join(core.ListItem(), "|")}, }, HideHelpCommand: true, - HideVersion: true, Action: func(c *cli.Context) error { if verbose { log.InitLog("debug") @@ -55,14 +52,16 @@ func Execute() { if err != nil { log.Error(err) } - items, err := browser.GetAllItems(exportData) + // default select all items + // also you can get single item with browser.GetItem(itemName) + items, err := browser.GetAllItems() if err != nil { log.Error(err) } name := browser.GetName() key := browser.GetSecretKey() for _, item := range items { - err := item.CopyItem() + err := item.CopyDB() if err != nil { log.Error(err) } diff --git a/core/browser.go b/core/browser.go index d3edd8f..712df70 100644 --- a/core/browser.go +++ b/core/browser.go @@ -27,8 +27,11 @@ type Browser interface { // GetSecretKey return browser secret key GetSecretKey() []byte - // GetAllItems, default return all of items(password|bookmark|cookie|history) - GetAllItems(itemName string) ([]common.Item, error) + // GetAllItems return all of items (password|bookmark|cookie|history) + GetAllItems() ([]common.Item, error) + + // GetItem return single one from password|bookmark|cookie|history + GetItem(itemName string) (common.Item, error) } const ( @@ -111,32 +114,33 @@ func (c *Chromium) GetSecretKey() []byte { return c.secretKey } -func (c *Chromium) GetAllItems(itemName string) (Items []common.Item, err error) { - itemName = strings.ToLower(itemName) +func (c *Chromium) GetAllItems() (Items []common.Item, err error) { var items []common.Item - if itemName == "all" { - for item, choice := range chromiumItems { - m, err := utils.GetItemPath(c.profilePath, choice.mainFile) - if err != nil { - log.Errorf("%s find %s file failed, ERR:%s", c.name, item, err) - continue - } - i := choice.newItem(m, "") - log.Debugf("%s find %s File Success", c.name, item) - items = append(items, i) + for item, choice := range chromiumItems { + m, err := utils.GetItemPath(c.profilePath, choice.mainFile) + if err != nil { + log.Errorf("%s find %s file failed, ERR:%s", c.name, item, err) + continue } - } else if item, ok := chromiumItems[itemName]; ok { + i := choice.newItem(m, "") + log.Debugf("%s find %s File Success", c.name, item) + items = append(items, i) + } + return items, nil +} + +func (c *Chromium) GetItem(itemName string) (common.Item, error) { + itemName = strings.ToLower(itemName) + if item, ok := chromiumItems[itemName]; ok { m, err := utils.GetItemPath(c.profilePath, item.mainFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", c.name, item.mainFile, err) } i := item.newItem(m, "") - items = append(items, i) - return items, nil + return i, nil } else { return nil, errItemNotSupported } - return items, nil } type Firefox struct { @@ -149,32 +153,35 @@ func NewFirefox(profile, key, name string) (Browser, error) { return &Firefox{profilePath: profile, keyPath: key, name: name}, nil } -func (f *Firefox) GetAllItems(itemName string) ([]common.Item, error) { - itemName = strings.ToLower(itemName) +func (f *Firefox) GetAllItems() ([]common.Item, error) { var items []common.Item - if itemName == "all" { - for item, choice := range firefoxItems { - var ( - sub, main string - err error - ) - if choice.subFile != "" { - sub, err = utils.GetItemPath(f.profilePath, choice.subFile) - if err != nil { - log.Errorf("%s find %s file failed, ERR:%s", f.name, item, err) - continue - } - } - main, err = utils.GetItemPath(f.profilePath, choice.mainFile) + for item, choice := range firefoxItems { + var ( + sub, main string + err error + ) + if choice.subFile != "" { + sub, err = utils.GetItemPath(f.profilePath, choice.subFile) if err != nil { log.Errorf("%s find %s file failed, ERR:%s", f.name, item, err) continue } - i := choice.newItem(main, sub) - log.Debugf("%s find %s file success", f.name, item) - items = append(items, i) } - } else if item, ok := firefoxItems[itemName]; ok { + main, err = utils.GetItemPath(f.profilePath, choice.mainFile) + if err != nil { + log.Errorf("%s find %s file failed, ERR:%s", f.name, item, err) + continue + } + i := choice.newItem(main, sub) + log.Debugf("%s find %s file success", f.name, item) + items = append(items, i) + } + return items, nil +} + +func (f *Firefox) GetItem(itemName string) (common.Item, error) { + itemName = strings.ToLower(itemName) + if item, ok := firefoxItems[itemName]; ok { var ( sub, main string err error @@ -191,12 +198,10 @@ func (f *Firefox) GetAllItems(itemName string) ([]common.Item, error) { } i := item.newItem(main, sub) log.Debugf("%s find %s file success", f.name, item.mainFile) - items = append(items, i) - return items, nil + return i, nil } else { return nil, errItemNotSupported } - return items, nil } func (f *Firefox) GetName() string { diff --git a/core/browser_darwin.go b/core/browser_darwin.go index 63e9056..e08d8b7 100644 --- a/core/browser_darwin.go +++ b/core/browser_darwin.go @@ -45,7 +45,7 @@ func (c *Chromium) InitSecretKey() error { cmd *exec.Cmd stdout, stderr bytes.Buffer ) - //➜ security find-generic-password -wa 'Chrome' + // ➜ security find-generic-password -wa 'Chrome' cmd = exec.Command("security", "find-generic-password", "-wa", c.name) cmd.Stdout = &stdout cmd.Stderr = &stderr diff --git a/core/browser_linux.go b/core/browser_linux.go index d426b26..bd11716 100644 --- a/core/browser_linux.go +++ b/core/browser_linux.go @@ -35,7 +35,7 @@ var ( ) func (c *Chromium) InitSecretKey() error { - //what is d-bus @https://dbus.freedesktop.org/ + // what is d-bus @https://dbus.freedesktop.org/ var chromeSecret []byte conn, err := dbus.SessionBus() if err != nil { diff --git a/core/common/parse.go b/core/common/parse.go index 9b85b68..d61b4c8 100644 --- a/core/common/parse.go +++ b/core/common/parse.go @@ -25,13 +25,13 @@ type Item interface { // FirefoxParse parse firefox items FirefoxParse() error - // OutPut with json or csv + // OutPut file name and format type OutPut(format, browser, dir string) error - // Copy item file to local path - CopyItem() error + // CopyDB is copy item db file to current dir + CopyDB() error - // Release item file + // Release is delete item db file Release() error } @@ -138,7 +138,7 @@ func (b *bookmarks) FirefoxParse() error { return nil } -func (b *bookmarks) CopyItem() error { +func (b *bookmarks) CopyDB() error { return utils.CopyDB(b.mainPath, filepath.Base(b.mainPath)) } @@ -266,7 +266,7 @@ func (c *cookies) FirefoxParse() error { return nil } -func (c *cookies) CopyItem() error { +func (c *cookies) CopyDB() error { return utils.CopyDB(c.mainPath, filepath.Base(c.mainPath)) } @@ -383,7 +383,7 @@ func (h *historyData) FirefoxParse() error { return nil } -func (h *historyData) CopyItem() error { +func (h *historyData) CopyDB() error { return utils.CopyDB(h.mainPath, filepath.Base(h.mainPath)) } @@ -526,14 +526,13 @@ func (p *passwords) FirefoxParse() error { Password: string(decrypt.PKCS5UnPadding(pwd)), CreateDate: v.CreateDate, }) - } } } return nil } -func (p *passwords) CopyItem() error { +func (p *passwords) CopyDB() error { err := utils.CopyDB(p.mainPath, filepath.Base(p.mainPath)) if err != nil { log.Error(err) diff --git a/core/decrypt/decrypt_darwin.go b/core/decrypt/decrypt_darwin.go index 9b9a433..451fa67 100644 --- a/core/decrypt/decrypt_darwin.go +++ b/core/decrypt/decrypt_darwin.go @@ -84,16 +84,16 @@ func Nss(globalSalt, masterPwd []byte, pbe NssPBE) ([]byte, error) { } func decryptPBE(globalSalt, masterPwd, entrySalt, encrypted []byte) ([]byte, error) { - //byte[] GLMP; // GlobalSalt + MasterPassword - //byte[] HP; // SHA1(GLMP) - //byte[] HPES; // HP + EntrySalt - //byte[] CHP; // SHA1(HPES) - //byte[] PES; // EntrySalt completed to 20 bytes by zero - //byte[] PESES; // PES + EntrySalt - //byte[] k1; - //byte[] tk; - //byte[] k2; - //byte[] k; // final value containing key and iv + // byte[] GLMP; // GlobalSalt + MasterPassword + // byte[] HP; // SHA1(GLMP) + // byte[] HPES; // HP + EntrySalt + // byte[] CHP; // SHA1(HPES) + // byte[] PES; // EntrySalt completed to 20 bytes by zero + // byte[] PESES; // PES + EntrySalt + // byte[] k1; + // byte[] tk; + // byte[] k2; + // byte[] k; // final value containing key and iv glmp := append(globalSalt, masterPwd...) hp := sha1.Sum(glmp) s := append(hp[:], entrySalt...) diff --git a/core/decrypt/decrypt_linux.go b/core/decrypt/decrypt_linux.go index 24ebd83..3b23943 100644 --- a/core/decrypt/decrypt_linux.go +++ b/core/decrypt/decrypt_linux.go @@ -119,16 +119,16 @@ func Nss(globalSalt, masterPwd []byte, pbe NssPBE) ([]byte, error) { } func decryptMeta(globalSalt, masterPwd, entrySalt, encrypted []byte) ([]byte, error) { - //byte[] GLMP; // GlobalSalt + MasterPassword - //byte[] HP; // SHA1(GLMP) - //byte[] HPES; // HP + EntrySalt - //byte[] CHP; // SHA1(HPES) - //byte[] PES; // EntrySalt completed to 20 bytes by zero - //byte[] PESES; // PES + EntrySalt - //byte[] k1; - //byte[] tk; - //byte[] k2; - //byte[] k; // final value conytaining key and iv + // byte[] GLMP; // GlobalSalt + MasterPassword + // byte[] HP; // SHA1(GLMP) + // byte[] HPES; // HP + EntrySalt + // byte[] CHP; // SHA1(HPES) + // byte[] PES; // EntrySalt completed to 20 bytes by zero + // byte[] PESES; // PES + EntrySalt + // byte[] k1; + // byte[] tk; + // byte[] k2; + // byte[] k; // final value conytaining key and iv glmp := append(globalSalt, masterPwd...) hp := sha1.Sum(glmp) s := append(hp[:], entrySalt...)